javascript - 将 JSON 响应转换为 JavaScript 中的正确编码

标签 javascript json encoding request utf

我正在尝试使用来自 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/

相关文章:

c - 使用打印语句和汉诺塔的c++中的%c

Powershell Remedy ARQ 文件,可能存在编码问题

javascript - TS2304 : Cannot find name '__decorate' , '__metadata' 和 '__extends'

json - 将 mustache.js 与编号数组一起使用

javascript - 当初始屏幕工作时,如何使用 XD datetimepicker 显示日历?

JSON 对象未定义 (Nodejs)

java - 压缩netty发送的数据

Jenkins 管道 : How to write UTF-8 files with writeFile?

javascript - 使用图像区域作为提交

javascript - CSS淡入淡出给出了一个奇怪的闪烁