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

问题描述 投票:0回答:1

我已经和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。我究竟做错了什么?

android json dart flutter
1个回答
0
投票

首先是旁边: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发送相同的请求并检查响应。

你是如何试图展示角色的?如果可能只是你正在使用的字体没有它们。

© www.soinside.com 2019 - 2024. All rights reserved.