zoukankan      html  css  js  c++  java
  • 字符串编码转换(GBK) NSString, char, NSData相互转化 从 GBK 转到 UTF8

    问题:
    1、Java后台返回的数据编码为 GBK  , 而xcode 端默认为UTF-8,所以,当iOS 手机端向java获取发送含有中文的数据时,数据显示为乱码。当iso手机端向java后台发送含有中文的请求时,后台不会有任何响应和数据的返回。
    
    解决方案:
    1、ios手机端通过后台获取含有中文时,出现乱码
    即:将获取到的GBK 编码的字符解析成正常的汉字
    方法:
    //声明一个gbk编码类型
     NSStringEncoding gbkEncoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
    //使用如下方法 将获取到的数据按照gbkEncoding的方式进行编码,结果将是正常的汉字
    NSString *zhuanHuanHouDeShuJu = [[NSString alloc] initWithData:huoQuDaoDeData encoding:gbkEncoding];
    
    例子:
    本次项目因为使用的是ASIFormDataRequest 工具类解析从后台获取的数据,所以,将ASIHTTPRequest.m文件中的如下方法:
    
    - (NSString *)responseString
    {
        NSData *data = [self responseData];
        if (!data) {
            return nil;
        }
        
        return [[[NSString alloc] initWithBytes:[data bytes] length:[data length] encoding:[self responseEncoding]] autorelease];
    }
    
    替换为
    - (NSString *)responseString
    {
        NSData *data = [self responseData];
        if (!data) {
            return nil;
        }
        //明确表示用 gbkEncoding 进行解码
        NSStringEncoding gbkEncoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
        return [[NSString alloc] initWithBytes:[data bytes] length:[data length] encoding:gbkEncoding];
    }
    
    届时,我们再用下面这个方法请求或发送中文,都不会有问题了:
    // 本类的公共方法 用于通过指定的URL获取数据。
    +(NSString *)getStingbyHTTPURL2:(NSString *)url
    {
    
        NSString *encodedURL = [url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
        ASIFormDataRequest *asiHttpRequest = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:encodedURL]];
        NSStringEncoding enc =  CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingUTF8);
        [asiHttpRequest setStringEncoding:enc];
        [asiHttpRequest startSynchronous];
        asiHttpRequest.delegate = self;
        NSString *strResult = [asiHttpRequest responseString];   //以上的修改就是为了这句
    
        return strResult;    
    }
    
    参考:    http://blog.sina.com.cn/s/blog_9e8867eb01013gbe.html
    
    从 GBK 转到 UTF-8   (上面的例子可作为一个成功案例)
    用 NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000) ,然后就可以用initWithData:encoding来实现。
    从 UTF-8 转到 GBK
    CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000),得到的enc却是kCFStringEncodingInvalidId。
    没关系,试试 NSData *data=[nsstring dataUsingEncoding:-2147482063];
    
注意:必须使用kCFStringEncodingGB_18030_2000这个字符集,那个kCFStringEncodingGB_2312_80试了也不行。
    成功案例: 将uif-8格式(xcode默认的)的字符串str_selectedLeiXing 转换为GBK格式的strGBK,如下所示:

        NSData *data = [str_selectedLeiXing dataUsingEncoding:-2147482063];

        NSString *strGBK = [[NSString alloc]initWithData:data encoding:-2147482063];

    以上代码的实现,不需要添加任何附加开发包。

    
    
    iphone之NSString, char, NSData相互转化
    
    1. NSString转化为UNICODE String:
    (NSString*)fname = @“Test”;
     
    char fnameStr[10];
    memcpy(fnameStr, [fname cStringUsingEncoding:NSUnicodeStringEncoding], 2*([fname length]));
    2. NSString转化为char
    (NSString*)fname = @“Test”;
    char fnameStr[10];
    fnameStr =[fname UTF8String];
    3. char -> NSData:
     方法一:
       char * postData = "TEST";
     
       NSData *data = [NSData dataWithBytes:postData length:strlen(postData)];
     方法二:
        转换为NSString: - (id)initWithUTF8String:(const char *)bytes
    然后用NSString的 - (NSData *)dataUsingEncoding:(NSStringEncoding)encoding
    4. NSData ->char
      NSData returnData ;
      char* bu=[returnData bytes];
    //使用下面两个方法,获取可以将一个nsstring 从gbk和utf8之间互转
    5. NSData->NSString
    NSString* aStr;
    aStr = [[NSString alloc] initWithData:aData encoding:NSASCIIStringEncoding];
    6. NSString->NSData
    NSData* aData;
    aData = [aStr dataUsingEncoding: NSASCIIStringEncoding];
    
    参考:http://blog.sina.com.cn/s/blog_4adf31ea0100t4y7.html

    http://www.devdiv.com/article-1397-1.html

    问题延伸:

    再开发有手机端的应用程序软件时,要保证3个方面的数据编码格式一致,他们分别是:

    1、java 后台的编码格式

    2、手机端的编码格式(ios 默认时utf-8)

    3、服务器tomcat 端口的编码格式(tomcat 端口默认没有设置编码格式,所以,默认情况下它不支持utf-8 编码的汉字)

    一般地,用ios开发手机端,都需要设置tomcat端口的编码格式为utf-8

  • 相关阅读:
    Nginx反向代理和jetty服务器配置
    如何使用canvas绘图
    毕业后,你折腾了多久做了多少努力才找到正确的方向或者道路?
    如何提高用户逃离成本
    首次创业者必须知道哪些基本常识?
    拦截器、过滤器、监听器各有什么作用
    第一人称入行分享贴:大学混了四年,如何顺利入行互联网
    线下学习
    如何实现数组深拷贝和浅拷贝?
    从零学前端第二讲:CSS行内块级元素布局与定位
  • 原文地址:https://www.cnblogs.com/ygm900/p/3090950.html
Copyright © 2011-2022 走看看