4

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

规格说:

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

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

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

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

4

1 回答 1

3

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

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

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

Take the high surrogate (0xD801) and subtract 0xD800, then multiply by 0x400, resulting in 0x0001 × 0x400 = 0x0400. Take the low surrogate (0xDC37) and subtract 0xDC00, resulting in 0x37. Add these two results together (0x0437), and finally add 0x10000 to get the final decoded UTF-32 code point, 0x10437.

于 2018-10-18T22:55:51.543 回答