从代码点到 UTF-16 代码单元代理对的转换
Conversion from code point to UTF-16 code unit surrogate pair
我正在尝试将 Unicode 字符转换为 UTF-16 代理项对:
字符"Face with Medical Mask"是代码点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
我正在尝试将 Unicode 字符转换为 UTF-16 代理项对:
字符"Face with Medical Mask"是代码点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