我正在Xojo中编写JSON解析器。它与我无法弄清楚如何编码和解码不在基本多语言平面(BMP)中的unicode字符串的事实有所不同。换句话说,如果遇到大于\uFFFF
的东西,我的解析器就会死亡。
规格说明:
要转义不在“基本多语言平面”中的代码点, 该字符可以表示为十二个字符的序列, 对与代码点相对应的UTF-16代理对进行编码。所以 例如,仅包含G谱号字符的字符串(U + 1D11E) 可以表示为“ \ uD834 \ uDD1E”。但是,是否有处理器 JSON文本将这样的代理对解释为单个代码点或 作为显式代理对是一个语义决定,即 由特定处理器确定。
我不知道从U+1D11E
到\uD834\uDD1E
的算法是什么。我找不到有关如何“编码对应于代码点的UTF-16代理对”的任何解释。
例如,说我想对笑脸字符(U+1F600
)进行编码。作为UTF-16代理对,这将是什么?如何推导它?
有人能至少请我指出正确的方向吗?
答案 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。