美文网首页
iOS之GBK编码_知道的轻车熟路不知道的翻山越岭

iOS之GBK编码_知道的轻车熟路不知道的翻山越岭

作者: LD_左岸 | 来源:发表于2018-05-13 14:04 被阅读405次

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];

鉴于能力有限 水平一般 理解有误之处 望不吝指出 深表感谢.

相关文章

网友评论

      本文标题:iOS之GBK编码_知道的轻车熟路不知道的翻山越岭

      本文链接:https://www.haomeiwen.com/subject/oukldftx.html