android - 如何将 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。我究竟做错了什么?
解决方案
先说一句: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 发送相同的请求并检查响应。
你是如何尝试展示角色的。如果可能只是您使用的字体没有它们。
推荐阅读
- java - Install4j Java 最低版本似乎不起作用
- php - 由于语法错误,在 zend-db 中 UNION SELECT 失败
- vuzix - 如何在 android studio 模拟器中运行我的 vuzix android glass 应用程序?
- c - 非阻塞套接字在不消耗数据的情况下获得 errno?
- java - 如何修复 Android Studio 中的“Missing classes”错误?
- mono.cecil - 在 Mono.Cecil 中解析对 TypeDefinition 的 TypeReference 失败并出现程序集解析错误
- wagtail - 如何添加一个类别片段,用于不同的片段
- airflow - 气流UnicodeDecodeError:'ascii'编解码器无法解码字节0xe2
- python - 使用 zip 在数据框中编织列
- excel - 计算我们增加给定日期范围的次数