AFNetworking 中的奇怪编码行为
Posted
技术标签:
【中文标题】AFNetworking 中的奇怪编码行为【英文标题】:Strange encoding behaviour in AFNetworking 【发布时间】:2014-03-08 12:06:01 【问题描述】:我在 ios 项目中使用 AFNetworking,到目前为止一切正常。现在我有一个 php 脚本,它应该获取一些信息并返回一些 json。脚本提供的信息和它应该返回的 json 都包含拉丁字符,主要是 ã 和 õ。
问题是,当我在我的 iOS 应用程序中接收回 json 时,字符被编码为我认为的 NSNonLossyASCIIStringEncoding。我认为编码不是 UTF8,因为回到应用程序:
[jsonManager GET:myURL parameters:sendingData success:^(AFHTTPRequestOperation *op,id responseObject)
NSLog(@"%d",op.responseStringEncoding);
NSLog(@"%d",op.responseSerializer.stringEncoding);
NSLog(@"%@",op.responseString);
NSLog(@"%@",[[NSString alloc]initWithData:op.responseData encoding:NSNonLossyASCIIStringEncoding]);
failure:^(AFHTTPRequestOperation *op,NSError *error)
NSLog(@"%@",op.responseString);
];
最后一个 NSLog(在成功的情况下)是唯一一个按预期输出 responseString 的日志。第三个日志输出 \u00e3 代替每个 ã。 第一个日志确认使用的编码是 NSUTF8StringEncoding。 第二个日志指出 responseSerializer.stringEnconding 是 NSNonLossyASCIIStringEncoding 因为我设置它是这样的,在发出请求之前,它没有任何区别,也不知道为什么......
真正奇怪的是,如果我使用浏览器调用脚本,我可以看到输出被编码为 UTF8。
这里有什么问题?
谢谢。
【问题讨论】:
【参考方案1】:听起来您的服务器根据客户端或某些标头使用不同的编码类型。
NSJSONSerialization 严格实现RFC 4627,其中声明:
JSON 文本应以 Unicode 编码。默认编码是 UTF-8。
JSON 总是 Unicode 编码,所以我猜你的服务器没有遵循规范。
尝试使用 CURL 或 Chrome 插件(如 Advanced REST Client)复制该行为,而不是使用您的浏览器。一个起点是您的服务器解析 Accept
、User-Agent
和 Content-Type
标头。
【讨论】:
以上是关于AFNetworking 中的奇怪编码行为的主要内容,如果未能解决你的问题,请参考以下文章
AFNetworking 2.0 请求挂在 iOS 9 / WatchOS 2 中的 Today Extension 和 Watch 应用程序中