我正在尝试将Unicode字符转换为UTF-16代理对:
字符“带有医用口罩的脸”😷是代码点U+1F637
。
用二进制表示,是:1 1111 0110 0011 0111
。
根据Wikipedia将此编码为UTF-16,我需要执行以下操作:
从代码点减去0x10000。
11111011000110111 - 10000 = 011111011000100111
高十位(在0x000–0x3FF范围内)被添加到0xD800,以给出第一个16位代码单元或高代理(W1)
0001111101 + 1101100000000000 = 01101100001111101 (D87D)
低十位(也在0x000-0x3FF范围内)被添加到0xDC00,以给出第二个16位代码单元或低代理(W2),其范围为0xDC00-0xDFFF。
1000100111 + 1101110000000000 = 01101111000100111 (DE27)
所以我有两个代码单元D87D
和DE27
,但我知道正确的结果是:
console.log('\uD83D\uDE37')
我在做什么错?
您有:
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