【问题标题】:Converting JSON response into correct encoding in JavaScript将 JSON 响应转换为 JavaScript 中的正确编码
【发布时间】:2019-12-07 10:02:30
【问题描述】:

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

更新: 这是显示行为的simple glitch project

【问题讨论】:

  • 您的控制台使用什么编码?
  • 另外,实际问题是什么?您希望看到什么?
  • 我已将问题更新为更精确...当我使用 express 重新呈现收到的 JSON 时,它会有所不同。到目前为止,我无法找出问题所在。如果是 requestaxios 或两者中的 JSON 解析问题;或者是否是express的JSON渲染问题;或者如果 API 的实际内容有问题 - 但简单的重新渲染不应转换编码/字符...
  • 在源头听起来像mojibake\u00e2\u0080\u0099 不会以任何方式直接解析为反引号。

标签: javascript json encoding request utf


【解决方案1】:

问题出在源数据中:JSON 序列"\u00e2\u0080\u0099"不代表右右引号。这里有三个Unicode码位,第一个代表“â”,另外两个是控制字符。

您可以在开发控制台中验证这一点,或者通过运行下面的 sn-p:

console.log(JSON.parse('"\u00e2\u0080\u0099"'));

显然,该 JSON 的作者混淆了两件事:

  • JSON 编码为 UTF
  • \u 表示法表示 Unicode 代码点

第一个表示将 JSON 文本编码为字节的 filestream 应该是 UTF 编码(首选 UTF8)。第二个与此无关。 JSON 语法允许使用 \u 语法指定 16 位 Unicode 代码点。它的目的不是生成具有\u 编码序列1 的UTF8 字节序列。在定义 JSON 文本时,不应该关心较低级别的 UTF8 字节流编码。

1 我可能至少需要提及 代理对,但它们与 UTF8 确实无关,但更多的是 Unicode 代码点如何超过 16 -bit 范围可以用 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 字节一样。这样的修复将很难维护,甚至可能会出现误报

【讨论】:

    【解决方案2】:

    我认为这不是错误,您可以使用此扩展程序在浏览器上查看 JSON JSON Viewer

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-27
      • 1970-01-01
      • 2017-05-18
      • 1970-01-01
      • 2015-05-12
      • 1970-01-01
      • 1970-01-01
      • 2022-06-15
      相关资源
      最近更新 更多