JSON解析器如何对不在基本多语言平面中的Unicode字符进行编码?

时间:2018-10-18 19:23:33

标签: javascript json unicode xojo

我正在Xojo中编写JSON解析器。它与我无法弄清楚如何编码和解码不在基本多语言平面(BMP)中的unicode字符串的事实有所不同。换句话说,如果遇到大于\uFFFF的东西,我的解析器就会死亡。

规格说明:

  

要转义不在“基本多语言平面”中的代码点,   该字符可以表示为十二个字符的序列,   对与代码点相对应的UTF-16代理对进行编码。所以   例如,仅包含G谱号字符的字符串(U + 1D11E)   可以表示为“ \ uD834 \ uDD1E”。但是,是否有处理器   JSON文本将这样的代理对解释为单个代码点或   作为显式代理对是一个语义决定,即   由特定处理器确定。

我不知道从U+1D11E\uD834\uDD1E的算法是什么。我找不到有关如何“编码对应于代码点的UTF-16代理对”的任何解释。

例如,说我想对笑脸字符(U+1F600)进行编码。作为UTF-16代理对,这将是什么?如何推导它?

有人能至少请我指出正确的方向吗?

1 个答案:

答案 0 :(得分:1)

摘自雷米·勒博(Remy Lebeau)在上述评论中链接的维基百科文章(link):

  

要将U + 10437()编码为UTF-16:

     

从代码点减去0x10000,剩下0x0437。为了高   代理,右移10(除以0x400),然后加上0xD800,   结果为0x0001 + 0xD800 = 0xD801。对于低代理,请采取   低10位(除以0x400的余数),然后加0xDC00,   结果为0x0037 + 0xDC00 = 0xDC37。从解码U + 10437()   UTF-16:

     

取高代理(0xD801)减去0xD800,然后乘以   0x400,结果为0x0001×0x400 = 0x0400。采取低代理   (0xDC37),然后减去0xDC00,得出0x37。将这两个结果相加   (0x0437),最后加上0x10000以获得最终的解码   UTF-32代码点,0x10437。