我正在尝试使用来自 API 的数据。我正在使用request用于 API 访问,但也尝试过 axios .
const request = require('request')
request('https://remoteok.io/api', function (error, response, body) {
const data = JSON.parse(body)
console.log(data)
})
访问网站时 remoteok.io/api 在浏览器中,我可以看到类似 \u00e2\u0080\u0099
的序列。这个序列应该是反引号撇号,但是当我在 JavaScript 中登录到控制台或使用 express 时为了渲染 res.json(body)
,我得到的是字符 –
。
如何解决这个编码问题? JSON 不应该总是纯 UTF-8 吗?
UPDATE: Here is a simple glitch project that shows the behavior.
最佳答案
问题出在源数据中:JSON 序列“\u00e2\u0080\u0099”
不代表右引号。这里有三个 Unicode 代码点,第一个代表“â”,另外两个是控制字符。
您可以在开发控制台中验证这一点,或者通过运行下面的代码片段来验证:
console.log(JSON.parse('"\u00e2\u0080\u0099"'));
显然该 JSON 的作者混淆了两件事:
- JSON 采用 UTF 编码
\u
表示法代表 Unicode 代码点
第一个意味着将 JSON 文本编码为字节的文件或流应该是 UTF 编码(首选 UTF8)。第二个与此无关。 JSON 语法允许使用 \u
语法指定 16 位 Unicode 代码点。它并非旨在生成具有 \u
编码序列1 的 UTF8 字节序列。定义 JSON 文本时不应关心较低级别的 UTF8 字节流编码。
1 我可能至少需要提及代理对,但它们确实与 UTF8 无关,但更多的是与 Unicode 代码点如何超越 16 相关- 位范围可以用 JSON 进行编码。
因此,尽管右引号 has an UTF8 sequence of E2 80 99 ,这三个字节中的每一个都不应使用 \u
表示法进行编码。
右引号具有 Unicode 代码点 \u2019
。因此,源 JSON 应该具有该内容,或者它应该仅具有字面上的字符 ' (这确实是字节流中的 UTF8 序列,但这是一个低于的级别> JSON)
看看这两种可能性:
console.log(JSON.parse('"’"'));
console.log(JSON.parse('"\u2019"'));
现在呢?
我建议您联系该特定 API 的服务提供商。他们的 JSON 生成服务存在错误。
无论您做什么,都不要尝试在使用此服务的客户端中修复此问题,尝试识别此类格式错误的序列并替换它们,就好像这些字符代表 UTF8 字节一样。这样的修复将很难维护,甚至可能出现误报。
关于javascript - 将 JSON 响应转换为 JavaScript 中的正确编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57264420/