字符串編碼轉換(GBK) NSString, char, NSData相互轉化 從 GBK 轉到 UTF-8


問題: 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM