从代码点到 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 我需要执行以下操作:

  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')

我做错了什么?

你有:

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