JavaScript может помещать строку ansi в текстовое поле, но не utf-8?

Я всегда везде использую UTF-8. Но я только что наткнулся на странную проблему.

Вот минимальный пример HTML-файла:

<html>
<head>
<meta charset="utf-8" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript">
function Foo()
{
    var eacute_utf8 = "\xC3\xA9";
    var eacute_ansi = "\xE9";
    document.getElementById("bla1").value = eacute_utf8;
    document.getElementById("bla2").value = eacute_ansi;
}
</script>
</head>
<body onload="Foo()">
<input type="text" id="bla1">
<input type="text" id="bla2">
</body>
</html>

HTML содержит заголовок кодировки utf-8, поэтому на странице используется кодировка utf-8. Следовательно, я ожидал бы, что первое поле будет содержать символ «é» (e острый), а второе поле - что-то вроде «�», поскольку один байт E9 не является допустимой строкой в ​​кодировке utf-8.

Однако, к моему удивлению, первый содержит 'Ã ©' (как будто данные utf-8 интерпретируются как некоторый вариант ansi, вероятно, iso-8859-1 или windows-1252), а второй содержит фактический символ 'é' . Почему это!?

Обратите внимание, что моя проблема не связана с конкретной кодировкой, которую использует мой текстовый редактор - именно поэтому я использовал явные конструкции символов \ x. Они содержат правильное двоичное представление (в формате, совместимом с ascii) этого символа в кодировках ansi и utf-8.

Предположим, я хотел бы вставить символ «ę», это unicode U + 0119 или 0xC4 0x99 в кодировке utf-8, которого нет в iso-8859-1, windows-1252 или latin1. Как такое вообще возможно?


person Monty Carlo    schedule 15.04.2014    source источник


Ответы (1)


Строки JavaScript всегда являются строками символов Юникода, а не байтами. Заголовки кодирования или метатеги не влияют на интерпретацию управляющих последовательностей. Экраны \x не определяют байты, а являются сокращением для отдельных символов Юникода. Поэтому поведение ожидаемо. \xC3 эквивалентно \u00C3.

person Matti Virkkunen    schedule 15.04.2014
comment
Я понимаю, что заголовки кодирования или метатеги не имеют ничего общего с тем, как JavaScript интерпретирует буквальные строки или escape-последовательности. Но я бы предположил, что, принудительно вставляя определенную последовательность в поле HTML, она отображается в соответствии с указанным кодированием html. В любом случае, как я теперь понимаю, \ x всегда относятся к кодовым точкам Unicode (а не байтам) и никогда не имеют отношения к ansi, верно? - person Monty Carlo; 16.04.2014
comment
Указанная кодировка символов имеет значение только тогда, когда этот конкретный файл HTML анализируется браузером и превращается в дерево DOM. Все современные браузеры внутренне хранят строковые данные как Unicode. - person Matti Virkkunen; 16.04.2014
comment
Да, в JavaScript \x всегда относится к кодовой точке Unicode. Однако помните, что первые 255 кодовых точек Unicode совпадают с ISO-8859-1 (latin-1), который был довольно популярен в то время, поэтому вы можете обнаружить, что многие символы также будут соответствовать любому ANSI. - person Matti Virkkunen; 16.04.2014