为什么 JSON 编码 UTF-16 代理项对而不是直接编码 Unicode 代码点?

Why does JSON encode UTF-16 surrogate pairs instead of Unicode code points directly?

To escape a code point that is not in the Basic Multilingual Plane, the character is represented as a twelve-character sequence, encoding the UTF-16 surrogate pair. So for example, a string containing only the G clef character (U+1D11E) may be represented as "\uD834\uDD1E".

ECMA-404:The JSON Data Interchange Format

我相信there is no need to encode this character at all,所以可以直接表示为""。然而,如果有人希望对其进行编码,根据规范,它必须编码为 "\uD834\uDD1E",而不是(看起来合理的)"\u1d11e"。这是为什么?

JSON 的一个关键架构特征是 JSON 编码的对象是有效的 Javascript 文字,可以使用 eval 函数进行评估,例如.不幸的是,较旧的 Javascript 实现仅支持 16 位 Unicode 转义序列,在字符串文字中有四个十六进制字符,因此除了以可移植的方式在转义序列中使用 UTF-16 代理来处理 0xFFFF 以上的代码点之外,别无他法。 (允许任意代码点的 \u{...} 语法仅在 ECMAScript 6 中引入。)

但是正如您提到的,如果您的应用程序支持 Unicode JSON 文本,则无需使用转义序列。只需将字符直接编码为相应的 Unicode 格式即可。