为什么 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 格式即可。
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 格式即可。