一尘不染

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

json

为了转义不在基本多语言平面中的代码点,该字符表示为十二个字符的序列,对UTF-16代理对进行编码。因此,例如,仅包含G谱号字符(U +
1D11E)的字符串可以表示为"\uD834\uDD1E"

我认为根本不需要编码此字符,因此可以将其直接表示为"𝄞"。但是,如果希望对其进行编码,则必须按照规范将其编码为"\uD834\uDD1E",而不是(在合理的情况下)编码为"\u1d11e"。为什么是这样?


阅读 551

收藏
2020-07-27

共1个答案

一尘不染

JSON的关键体系结构特征之一是,JSON编码的对象是有效的Javascript文字,eval例如,可以使用函数进行评估。不幸的是,较早的Javascript实现仅支持16位Unicode转义序列,字符串文字中包含四个十六进制字符,因此,除了以便携式方式对大于0xFFFF的代码点在转义序列中使用UTF-16替代符之外,没有其他方法。(\u{...}仅在ECMAScript6中引入了允许任意代码点的语法。)

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

2020-07-27