Я пытаюсь преобразовать символ Unicode в суррогатную пару UTF-16:
Символ "Face with Medical Mask" ? является кодовой точкой U+1F637
.
В двоичном коде это is: 1 1111 0110 0011 0111
.
Согласно Википедии для кодирования этого в 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')
Что я делаю не так?