如何将 json 字符串解码为 UTF-8?
Posted
技术标签:
【中文标题】如何将 json 字符串解码为 UTF-8?【英文标题】:How to decode json string as UTF-8? 【发布时间】:2019-09-15 19:46:30 【问题描述】:我使用 json 已经有一段时间了,问题是我解码的字符串被编码为 Latin-1,我无法让它作为 UTF-8 工作。因此,某些字符显示不正确(例如 ' 显示为 ')。
我在这里阅读了一些关于 *** 的问题,但它们似乎不起作用。
我正在使用的 json 结构如下所示(来自 YouTube API):
...
"items": [
...
"snippet":
...
"title": "Powerbeats Pro “Totally Wireless” Except when you need a wire",
...
]
我将其编码为:
response = await http.get(link, headers: HttpHeaders.contentTypeHeader: "application/json; charset=utf-8");
extractedData = json.decode(response.body);
dataTech = extractedData["items"];
然后我尝试将第二行更改为:
extractedData = json.decode(utf8.decode(response.body));
但这给了我一个关于错误格式的错误。所以我把它改成了:
extractedData = json.decode(utf8.decode(response.bodyBytes));
这不会引发错误,但也不能解决问题。玩弄标题两者都没有。
我希望数据像现在一样存储在 dataTech 中,但编码为 UTF-8。我做错了什么?
【问题讨论】:
【参考方案1】:只需添加标题:'Accept': 'application/json;字符集=UTF-8'; 它对我有用
【讨论】:
【参考方案2】:先说一句:UTF-8 通常是一种外部 格式,通常由字节数组表示。它是您可以通过网络作为 HTTP 响应的一部分发送的内容。在内部,Dart 将字符串存储为 UTF-16 代码点。 utf8
编码器/解码器在内部格式字符串和外部格式字节数组之间进行转换。
这就是你使用utf8.decode(response.bodyBytes)
的原因;获取原始正文字节并将它们转换为内部字符串。 (response.body
基本上也是这样做的,但是它根据响应标头字符集选择字节-> 字符串解码器。当此字符集标头丢失时(通常是这样),http
包选择 Latin-1,这显然不会如果您知道响应使用不同的字符集,则不起作用。)通过自己使用utf8.decode
,您将覆盖http
所做的(可能是错误的)选择,因为您知道这个特定的服务器总是发送UTF-8 . (当然可能不会!)
另外一点:在 request 上设置内容类型标头很少有用。您通常不发送任何内容 - 所以它没有类型!这不会影响服务器将发回给您的内容类型或内容类型字符集。 accept
标头可能是您正在寻找的。这是向服务器提示您希望返回哪种类型的内容 - 但并非所有服务器都尊重它。
那么为什么你的特殊字符仍然不正确?在解码之前尝试打印utf8.decode(response.bodyBytes)
。它在控制台中看起来正确吗? (为这类问题创建一个简单的 Dart 命令行应用程序非常有用;我发现在一个简单的 10 行 Dart 应用程序中设置断点和检查变量更容易。)尝试使用 Wireshark 之类的东西来捕获线路上的字节(再次,有一个简单的 Dart 应用程序很有用)。或者尝试使用 Postman 发送相同的请求并检查响应。
您如何尝试显示角色。如果可能只是您使用的字体没有它们。
【讨论】:
非常感谢您详细解答我的问题。由于我是一名初级开发人员,我并不真正理解标题的概念,所以它非常有帮助。我检查了控制台输出,结果发现问题是 json 文件中的字符编码不正确。我只是用replaceAll()
替换了它们。虽然,这似乎不是一个理想的解决方案,但它确实有效以上是关于如何将 json 字符串解码为 UTF-8?的主要内容,如果未能解决你的问题,请参考以下文章
使用Javascript的atob解码base64不能正确解码utf-8字符串