今天业务中遇到了个关于网络返回数据 jsonp 格式解析的问题,记录一下。
遇到问题
一般情况下我们网络请求返回的数据都是 json 格式
{
"result":[
{
"Name": "Bob",
"Age": 32,
},
{
"Name": "John",
"Age": 20,
},
{
"Name": "Henry",
"Age": 45,
}
],
"query":"hello"
}
今天做业务遇到一个 jsonp 的格式,用抓包工具抓取的数据结果为以下这个样子, 外面多了个函数包裹。
callback({
"result":[
{
"Name": "Bob",
"Age": 32,
},
{
"Name": "John",
"Age": 20,
},
{
"Name": "Henry",
"Age": 45,
}
],
"query":"hello"
})
在用 AFNetwording 得到返回数据后,问题来了直接打印返回数据 responseObject,显示是一串编码。
解决问题
刚开始以为是 UTF8 编码,就用了以下方法进行编码转化,结果返回的字符串仍为空,网上搜索了一下, 在 UTF-8的字符中混进了其他编码格式的字符,这样NSData转NSString的时候,就是返回nil
NSString *string = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
具体的解决 UTF-8 字符掺杂其他编码格式的过程可以参看这篇文章, 回到问题上来,我按照文章的方法处理之后的结果如图:
任然没有解决问题,之后在浏览器查阅返回结果,发现返回数据是GBK 编码,并非 UTF-8编码,按照以下方法就可以得到正确的结果了
unsigned long encode = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
NSString *result = [[NSString alloc] initWithData:responseObject encoding:encode];
绕了一大圈才定位到问题,记录备用。