如何将json字符串解码为UTF-8?

Kar*_*ski 6 android json dart flutter

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

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

我正在使用的 json 结构如下所示(来自 YouTube API):

...
"items": [
  {
   ...
   "snippet": {
    ...
    "title": "Powerbeats Pro “Totally Wireless” Except when you need a wire",
    ...
    }
   }
  ]

Run Code Online (Sandbox Code Playgroud)

我编码它:

...
"items": [
  {
   ...
   "snippet": {
    ...
    "title": "Powerbeats Pro “Totally Wireless” Except when you need a wire",
    ...
    }
   }
  ]

Run Code Online (Sandbox Code Playgroud)

然后我尝试将第二行更改为:

response = await http.get(link, headers: {HttpHeaders.contentTypeHeader: "application/json; charset=utf-8"});
extractedData = json.decode(response.body);
dataTech = extractedData["items"];

Run Code Online (Sandbox Code Playgroud)

但这给了我关于错误格式的错误。所以我把它改成:

extractedData = json.decode(utf8.decode(response.body));
Run Code Online (Sandbox Code Playgroud)

这不会引发错误,但也不会解决问题。玩标题也不会。

我希望数据像现在一样存储在 dataTech 中,但编码为 UTF-8。我究竟做错了什么?

Ric*_*eap 14

顺便说一句: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 命令行应用程序非常有用;我发现在一个简单的十行 Dart 应用程序中设置断点和检查变量更容易。)尝试使用类似 Wireshark 的东西来捕获线路上的字节(再次,为此拥有简单的 Dart 应用程序很有用)。或者尝试使用 Postman 发送相同的请求并检查响应。

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


小智 7

只需添加标题: 'Accept': 'application/json; charset=UTF-8'; 它对我有用