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

Gar*_*tet 5 javascript unicode json xojo

我正在 Xojo 中编写一个 JSON 解析器。除了我无法弄清楚如何编码和解码不在基本多语言平面 (BMP) 中的 unicode 字符串这一事实之外,它还可以工作。换句话说,如果遇到大于的东西,我的解析器就会死掉\uFFFF

规格说:

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

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

例如,假设我想对笑脸字符 ( U+1F600) 进行编码。作为 UTF-16 代理对,它会是什么样子?导出它的工作是什么?

有人至少可以指出我正确的方向吗?

Gar*_*tet 5

摘自 Remy Lebeau 在上面评论中链接的维基百科文章(链接):

\n\n
\n

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

\n\n

从代码点中减去 0x10000,留下 0x0437。对于高位代理,右移 10(除以 0x400),然后添加 0xD800,得到 0x0001 + 0xD800 = 0xD801。对于低代理项,取低 10 位(除以 0x400 的余数),然后加上 0xDC00,得到 0x0037 + 0xDC00 = 0xDC37。要从 UTF-16 解码 U+10437 ():

\n\n

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

\n
\n