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

时间:2016-07-19 15:41:38

标签: json unicode specifications ecma

  

要转义不在Basic Multilingual Plane中的代码点,该字符表示为十二个字符的序列,编码UTF-16代理对。因此,例如,只包含G谱号字符(U + 1D11E)的字符串可以表示为"\uD834\uDD1E"

ECMA-404:The JSON Data Interchange Format

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

1 个答案:

答案 0 :(得分:3)

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

但正如您所提到的,如果您的应用程序支持Unicode JSON文本,则无需使用转义序列。只需直接以相应的Unicode格式对字符进行编码。