从代码点到UTF-16代码单元代理对的转换

问题描述 投票:0回答:1

我正在尝试将Unicode字符转换为UTF-16代理对:

字符“带有医用口罩的脸”😷是代码点U+1F637

用二进制表示,是:1 1111 0110 0011 0111

根据Wikipedia将此编码为UTF-16,我需要执行以下操作:

  1. 从代码点减去0x10000。

    11111011000110111 - 10000 = 011111011000100111

  2. 高十位(在0x000–0x3FF范围内)被添加到0xD800,以给出第一个16位代码单元或高代理(W1)

    0001111101 + 1101100000000000 = 01101100001111101 (D87D)

  3. 低十位(也在0x000-0x3FF范围内)被添加到0xDC00,以给出第二个16位代码单元或低代理(W2),其范围为0xDC00-0xDFFF。

    1000100111 + 1101110000000000 = 01101111000100111 (DE27)

所以我有两个代码单元D87DDE27,但我知道正确的结果是:

console.log('\uD83D\uDE37')

我在做什么错?

unicode utf-16
1个回答
0
投票

您有:

0x10000 is subtracted from the code point 

11111011000110111 - 10000 = 011111011000100111

但是0x10000是二进制的1 0000 0000 0000 0000。因此,正确的算法是:

1 1111 0110 0011 0111 - 1 0000 0000 0000 0000 = 0 1111 0110 0011 0111
© www.soinside.com 2019 - 2024. All rights reserved.