ES 提案:格式正确的 JSON.stringify

由 Richard Gibson 提出的提案 “格式正确的 JSON.stringify” 是 ECMAScript 2019 的一部分。这篇博客文章解释它如何工作。

根据 JSON 的 RFC,如果你想使用 JSON,必须将参数编码为 UTF-8,那样的话使用 JSON.stringify() 有一个问题,因为它可能返回不能编码为 UTF-8 的 UTF-16 代码单元的结果。

怎么会发生这种事?如果是一个包含单独代理(lone surrogate)(范围在 0xD800–0xDFFF 内的 JavaScript 字符集)的 JavaScript 字符串,那么 JSON.stringify() 产生一个单独代理字符串:

console.log(JSON.stringify('\u{D800}') === '"\u{D800}"');
// -> false

单独的 UTF-16 代理字符不能编码为 UTF-8,这是为什么这个提案改变 JSON.stringify(),以便通过代码单元转义序列表示它们:

console.log(JSON.stringify('\u{D800}') === '"\\ud800"');
// -> true

注意:JSON 提供代码单元转义序列(例如 \uD800),但是不编码指向转义序列(例如 \u{D800})。


英文原文:https://2ality.com/2019/01/well-formed-stringify.html

Copyright © 2019 by Wu WenJun