首页 > 解决方案 > 如何将 json 字符串解码为 UTF-8?

问题描述

我使用 json 已经有一段时间了,问题是我解码的字符串被编码为 Latin-1,我无法让它作为 UTF-8 工作。因此,某些字符显示不正确(例如 ' 显示为 ')。

我已经在 stackoverflow 上阅读了一些问题,但它们似乎不起作用。

我正在使用的 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。我究竟做错了什么?

标签: androidjsondartflutter

解决方案


先说一句:UTF-8 通常是一种外部格式,通常由字节数组表示。它是您可以通过网络作为 HTTP 响应的一部分发送的内容。在内部,Dart 将字符串存储为 UTF-16 代码点。编码器utf8/解码器在内部格式字符串和外部格式字节数组之间进行转换。

这就是您使用的原因utf8.decode(response.bodyBytes);获取原始正文字节并将它们转换为内部字符串。(response.body基本上也是这样做的,但是它根据响应头字符集选择字节->字符串解码器。当缺少此字符集头时(通常是这样),http程序包会选择 Latin-1,如果您知道,这显然不起作用响应是不同的字符集。)通过使用utf8.decode你自己,你正在覆盖所做的(可能是错误的)选择,http因为你知道这个特定的服务器总是发送 UTF-8。(当然,它可能不会!)

另外一点:在请求上设置内容类型标头很少有用。您通常不发送任何内容 - 所以它没有类型!这不会影响服务器将发回给您的内容类型或内容类型字符集。标题accept可能是您正在寻找的。这是向服务器提示您想要返回哪种类型的内容 - 但并非所有服务器都尊重它。

那么为什么你的特殊字符仍然不正确?utf8.decode(response.bodyBytes)在解码之前尝试打印。它在控制台中看起来正确吗?(为这类问题创建一个简单的 Dart 命令行应用程序非常有用;我发现在一个简单的 10 行 Dart 应用程序中设置断点和检查变量更容易。)尝试使用 Wireshark 之类的东西来捕获线路上的字节(再次,有一个简单的 Dart 应用程序很有用)。或者尝试使用 Postman 发送相同的请求并检查响应。

你是如何尝试展示角色的。如果可能只是您使用的字体没有它们。


推荐阅读