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