Это html-файл:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>emoji</title>
</head>
<body>
    \ud83d\ude00
    <script>
        var string = '\ud83d\ude00';
        document.write(string);
        console.log(string);
    </script>
</body>
</html>

Юникод '������' в теге body может отображаться не как смайлик, а как строка. Но '������' может отображаться как смайлик с помощью document.write() и console.log(), даже если кодировка документа - UTF-8. Почему?


person Youngbye    schedule 21.07.2016    source источник
comment
Почему ты вообще используешь document.write? Не делай этого.   -  person John Dvorak    schedule 21.07.2016
comment
Javascript использует внутреннюю кодировку UTF-16. Независимо от того, что сказал ваш HTML или даже источник JS.   -  person Boldewyn    schedule 21.07.2016


Ответы (3)


UTF-8 в мета-заголовке просто говорит, как читать текст ответа HTML, он не переводит фактический документ DOM в какой-то режим, который делает сам документ UTF-8.

Что касается того, почему ваша строка работает: строка JavaScript имеет вид последовательность кодовых единиц UTF-16. Итак, '\ud83d\ude00' определяет эмодзи на уровне JavaScript. Затем вы используете document.write для записи этой строки в документ. В этот момент вы имеете дело с живым документом, а не с исходным текстом, который, как вы сказали, был в UTF-8.

Если вы хотите включить эмодзи в документ напрямую, а не через document.write, просто вставьте его в документ; ваш редактор выведет для него соответствующую последовательность UTF-8, если вы сохраните файл как UTF-8 (что вам нужно, потому что вы сообщили браузеру, что используете кодировку).

person T.J. Crowder    schedule 21.07.2016
comment
Спасибо за ваш комментарий! Это очень полезно для меня. - person Youngbye; 21.07.2016

Пожалуйста, считайте это дополнением к T.J. Ответ Краудера - у меня нет 50 представителей, поэтому я не могу добавить комментарий :(

Вы неправильно экранируете в html, в Javascript обратная косая черта (\) используется для экранирования, но в HTML экранирование достигается путем добавления префикса с амперсандом (&) и суффикса с точкой с запятой (;).

Вы можете использовать числовые ссылки на символы HTML:

<div>decimal:  &#128512;</div>
<div>hex:      &#x1f600;</div>

И вот хороший справочник по HTML-кодам эмодзи.

Отказ от ответственности: я не имею отношения к сайту

person Patrick Mead    schedule 21.07.2016
comment
Спасибо T.J. Теперь я удалил неверное утверждение. Кроме того, даже если оно было правильным, это предложение ничего не добавляет к ответу. - person Patrick Mead; 21.07.2016

Наиболее очевидной причиной может быть то, что \ud83d\ude00 не являются управляющими последовательностями в тесте HTML.

Использование сущностей HTML должно работать:

\ud83d\ude00
&#xd83d;&#xde00;
&#x1f600;

person Bergi    schedule 21.07.2016