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)复制该行为,而不是使用您的浏览器。一个起点是您的服务器解析 AcceptUser-AgentContent-Type 标头。

【讨论】:

以上是关于AFNetworking 中的奇怪编码行为的主要内容,如果未能解决你的问题,请参考以下文章

[AFN]AFNetworking错误总结

IOS AFN (第三方请求)

AFNetworking 2.0 请求挂在 iOS 9 / WatchOS 2 中的 Today Extension 和 Watch 应用程序中

AFN3.0封装

AFN2.0到3.0的迁移

iOS开发之AFN的基本使用