iOS之GBK编码_知道的轻车熟路不知道的翻山越岭
2018-05-13 本文已影响405人
LD_左岸
1. 服务器返回的是GBK编码的字符串 iOS端以UTF-8的字符串展示到Label上
NSStringEncoding enc =CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
NSData * data = [@"GBK编码的字符串" dataUsingEncoding:enc];
NSString * str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
label.text = str;
2.iOS端 将GBK编码的字符串传给服务器
- 一开始在这一点上 是方向搞错了 导致做了很多无用功
方向错在:
因为iOS端的参数 比如姓名 学校名称 都是中文 把这些值 以参数的形式传给后台 想着把这些值
转为GBK编码的字符串发给服务器就好了
于是开始了下面的搜索🔍谷歌➕百度
一搜 结果还真不少
-
第一 .
Snip20180513_1.png
不得不说很多地方千篇一律
-
第二.很多博客说的逻辑感觉没问题 比如
NSString*aString =@"这是一个测试string转GBK发送的字符串";
NSStringEncoding gbkEncoding=CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
NSData*aData = [aString dataUsingEncoding: gbkEncoding];
NSString*base64String = [aData base64EncodedStringWithOptions:0];
parameters[@"printcontent"] = [NSString stringWithFormat:@"T:%@",base64String];
[self.mgrPOST:followURL parameters:parameters progress:nil success:^(NSURLSessionDataTask*_Nonnulltask,id_NullableresponseObject) {
NSLog(@"%@",responseObject);
}failure:^(NSURLSessionDataTask*_Nullabletask,NSError*_Nonnullerror) {
NSLog(@"err : %@",error);
}];
这样往服务器端发送的数据就是gbk编码的了,数据库中写入的也是中文了,也能正确匹配中文了。
但是对我来说 却行不通
-
第三.根据以上两条 我给NSString添加了一个类别 用于将Xcode默认的utf-8的字符串转换成GBK编码的字符串
Snip20180513_2.png
到目前 也没整明白 上面那么转换 为什么不成功 比如传入@"1班"或者@"开发区"等转完结果为nil 当传入某些中文值时 又能有转完的结果
-
第四.在Github上找找吧
Snip20180513_3.png
无奈 也不行
三.最终 转换了思路 想到AFN对这块有无设置 一搜索 还真有
- 第一. 直接了当想到的就是一下这种设置 但是 并不行
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
NSStringEncoding gbkEncoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
manager.responseSerializer.stringEncoding = gbkEncoding;
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/json"];
[manager POST:TTBaseURL parameters:dictionary
success:^(AFHTTPRequestOperation *operation,id responseObject) {
if (succes) {
succes(responseObject);
}
}failure:^(AFHTTPRequestOperation *operation,NSError *error) {
if (fail) {
fail(error);
}
}];
四.经过以上的这些探索 无果后 通过如下方式终于OK了<啰嗦这么多 并不是凑字数 而是把整个问题的所有探索过程记录一下 方向很重要!!!>
NSString * urlStr = @"https://xxxxxxxxxxxxxx";
NSString * body = [NSString stringWithFormat:@"number=%@&selectcity=%@",assistNum,city];
NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlStr]];
[urlRequest setHTTPMethod: @"POST"];
[urlRequest setHTTPBody:[body dataUsingEncoding:enc]];
[urlRequest setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
AFHTTPSessionManager *mgr8 = [AFHTTPSessionManager manager];
mgr8.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json",@"text/html",@"text/json",@"text/plain",@"text/text",@"text/javascript",nil];
mgr8.requestSerializer = [AFHTTPRequestSerializer serializer];
mgr8.responseSerializer = [AFHTTPResponseSerializer serializer];
NSURLSessionDataTask *dataTask = [mgr8 dataTaskWithRequest:urlRequest completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
//处理成功之后的逻辑
}];
[dataTask resume];