Преобразование из кодовой точки в суррогатную пару кодовых единиц UTF-16 - PullRequest
0 голосов
/ 20 февраля 2020

Я пытаюсь преобразовать символ Unicode в суррогатную пару UTF-16:

Символ "Face with Medical Mask" ? является кодовой точкой U+1F637.

В двоичном коде это is: 1 1111 0110 0011 0111.

Согласно Википедии для кодирования этого в 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)

Итак, у меня есть две кодовые единицы D87D и DE27, но я знаю правильный результат:

console.log('\uD83D\uDE37')

Что я делаю не так?

1 Ответ

2 голосов
/ 20 февраля 2020

У вас есть:

0x10000 is subtracted from the code point 

11111011000110111 - 10000 = 011111011000100111

Но 0x10000 - это 1 0000 0000 0000 0000 в двоичном формате. Правильная арифметика c поэтому:

1 1111 0110 0011 0111 - 1 0000 0000 0000 0000 = 0 1111 0110 0011 0111
...