Подтвердить что ты не робот

Javascript "?".charCodeAt(0) застрял в 55357?

следующее не кажется правильным

"🚀".charCodeAt(0);  // returns 55357 in both Firefox and Chrome

что символ Юникода с именем ROCKET (U + 1F680), десятичное число должно быть 128640.

Это для приложения unicode, которое я пишу. Кажется, что большинство, но не ВСЕ символы из Unicode 6, все застряли в 55357.

как я могу это исправить? Спасибо.

4b9b3361

Ответ 1

JavaScript использует кодировку UTF-16; см. в этой статье для деталей:

Символы вне BMP, например. Теграмма U + 1D306 для центра (𝌆), может быть кодирована только в UTF-16 с использованием двух 16-разрядных кодовых блоков: 0xD834 0xDF06. Это называется суррогатной парой. Заметим, что суррогатная пара представляет только один символ.

Первый блок кода суррогатной пары всегда находится в диапазоне от 0xD800 до 0xDBFF, и называется высоким суррогатом или суррогатом свинца.

Второй блок кода суррогатной пары всегда находится в диапазоне от 0xDC00 до 0xDFFF, и называется суррогатом с низким суррогатом или суррогатом.

Вы можете декодировать суррогатную пару следующим образом:

codePoint = (text.charCodeAt(0) - 0xD800) * 0x400 + text.charCodeAt(1) - 0xDC00 + 0x10000

Полный код можно найти в документации Mozilla для charCodeAt.

Ответ 3

Я думаю, это потому, что они возвращают вам кодировку первого кода UTF-16 этого символа. Я не уверен, что вы можете многое сделать, потому что они возвращают 16-битное значение - я бы, вероятно, попробовал вручную декодировать символ из первых двух блоков кода, а затем кодировал его в UTF-32, что, кажется, что вы хотите.