gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 03:07:58 25 4
gpt4 key购买 nike

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

最佳答案

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

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

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

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

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

关于android - 如何将 json 字符串解码为 UTF-8?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55865173/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com