Печать emojis с помощью JavaScript и HTML

Почему это работает:

<p id="emoji">&#x1f604;</p>

И это не так:

document.getElementById("emoji").innerHTML = String.fromCharCode(parseInt('1f604', 16));

Ответы

Ответ 1

A 'char' в терминах JS - фактически код кода UTF-16, а не полный символ Юникода. (Это печальное положение вещей происходит с древних времен, когда не было никакой разницы *.) Чтобы использовать символ за пределами базовой многоязычной плоскости, вы должны записать его в кодированной UTF-16 форме суррогатная пара двух 16-разрядных кодовых блоков:

String.fromCharCode(0xD83D, 0xDE04)

В ECMAScript 6 мы получим некоторые интерфейсы, которые позволят нам иметь дело со строками, как если бы они были полными кодовыми точками Юникода, хотя они неполны и являются лишь фасад над типом String, который все еще сохраняется как последовательность кода кода. Тогда мы сможем сделать:

String.fromCodePoint(0x1F604)

Смотрите этот вопрос для некоторого кода polyfill, чтобы вы могли использовать эту функцию в современных браузерах.

(*: Когда я получаю доступ к машине времени, я оставляю Гитлера в покое и возвращаюсь, чтобы изобрести UTF-8 раньше. UTF-16 никогда не было!)

Ответ 2

Вы также можете использовать хакерский метод, если вы не хотите включать String.fromCodePoint() в свой код. Он состоит в создании виртуального элемента...

elem=document.createElement('p')

... Заполнение его рабочим HTML...

elem.innerHTML = "&#x1f604"

... И, наконец, получив его значение

value = elem.innerHTML

Чтобы сделать это коротко, это работает из-за того, что, как только вы установите значение контейнера HTML, значение преобразуется в соответствующий символ.

Надеюсь, что смогу помочь.