遇到的問題:
在請求后臺時,狀態(tài)碼返回是200,看到返回的內(nèi)容卻是nil链沼,在使用其它的請求工具嘗試,返回是正常的沛鸵。
分析:
1括勺、返回的內(nèi)容是通過NSData轉(zhuǎn)換的。那直接查看返回的data曲掰。是有數(shù)據(jù)長度疾捍。
2、看請求的result.response中栏妖,charset=GBK
得出的原因是:后臺返回的編碼解析出錯
來看下面具體的例子吧:
//直接轉(zhuǎn),將會產(chǎn)生亂碼或者字符串為空
NSString*temp1=[[NSStringalloc]initWithData:result.data encoding:NSUTF8StringEncoding];
NSString*temp2=[[NSStringalloc]initWithData:result.data encoding:NSASCIIStringEncoding];
NSLog(@"---------temp1---%@",temp1);//(null)
NSLog(@"---------temp2---%@",temp2);//{"status":45,"desc":"?é?¤??′í?ó?òê§D§","field":"mobileVCode"}
// 一乱豆、 GBK編碼 (通過CFStringCreateWithBytes轉(zhuǎn)碼)
CFStringRefGBKCFstirng=CFStringCreateWithBytes(NULL,[result.data bytes],[result.data length],kCFStringEncodingGB_18030_2000,false);
NSString*gbkNSString1=(__bridgeNSString*)GBKCFstirng;
NSLog(@"--gbkNSString1---%@",gbkNSString1);//{"status":45,"desc":"驗證碼錯誤或失效","field":"mobileVCode"}
// 二、 GBK編碼 (通過CFStringConvertEncodingToNSStringEncoding轉(zhuǎn)碼)
NSStringEncodingnsEncoding=CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
NSString*gbkNSString2=[[NSStringalloc]initWithData:result.data encoding:nsEncoding];
NSLog(@"--gbkNSString2---%@",gbkNSString2);//{"status":45,"desc":"驗證碼錯誤或失效","field":"mobileVCode"}
//轉(zhuǎn)成NSUTF8StringEncoding的字符串
NSData*tempdata=[gbkNSString1 dataUsingEncoding:NSUTF8StringEncoding];
NSString*UTF8_NSString=[[NSStringalloc]initWithData:tempdata encoding:NSUTF8StringEncoding];
NSLog(@"--UTF8_NSString--%@",UTF8_NSString);//{"status":45,"desc":"驗證碼錯誤或失效","field":"mobileVCode"}
總結:
Java后臺返回的數(shù)據(jù)編碼為 GBK ,而iOS吊趾、android默認為UTF-8宛裕。當iOS 手機端向java獲取發(fā)送含有中文的數(shù)據(jù)時,數(shù)據(jù)顯示為亂碼论泛。所以前后端之間則需要統(tǒng)一編碼了续滋。一般的規(guī)定,App發(fā)送與返回的編輯都是utf-8的孵奶。