Начинаем новую рубрику «пятиминутка ликбеза с сайтом Таблица символов Юникода»
Сегодня посмотрим на раздел «Управляющие символы С1», к которому относятся символы с кодами от 0080
до 009F
. То есть блок, идущий сразу после ASCII (первые 128 символов).
Этот раздел был унаследован Юникодом от кодовой страницы ISO 8859-1. Сама же ISO 8859-1 (также известная, как Latin-1), основана на символьном наборе для терминалов. В следствии чего, первые 32 символа были выделены для различных терминальных команд. То есть, «разрешение разрыва строки», «запрещение разрыва строки», «обратный перевод строки», «символ-заполнитель» и остальной допотопный треш.
На Latin-1 также раньше строились и другие 8-битные кодировки, в частности Windows-1252, использовавшаяся в Windows для западноевропейских алфавитов.
Однако, Microsoft, как всегда, сторонние стандарты использует, но только так, как хочет. Там решили, что в Latin-1 не попали многие нужные и ненужные, но забавные, символы. Например, не попал знак евро (€), что всех очень напрягало, так как цены на сайтах писать не удобно. Зато целых тридцать две позиции занимают какие-то символы для терминалов. Кому они нужны? На терминалах-то и Windows нету.
То есть, взяли и понапихали в этот раздел своих символов. Был символ 0080
«символом-заполнителем», а стал знаком евро. Ещё различных крестиков, процентиков, знаков функций и ещё чего-то совершенно непонятного напридумывали. Ну, и шрифты, соответственно, перерисовали, чтобы на 128-м месте шло евро. А если какой терминал подавится подобным текстом, то никому уже никакого дела не было.
И потом пришёл Юникод, а у него в стандарте 0080
никакой не евро. Евро у него — 20AC
. А 0080—009F
, по-прежнему, терминальные символы.
То есть, все тексты, которые раньше использовали эти символы из win-1252, они как-бы неправильные. И советы по всей сети, вроде «для ввода евро нажмите ALT+128» тоже неправильные.
Но это какая-то нехорошая ситуация, поэтому её решили, как всегда костылём. Например, в стандарте HTML5 сказано, символы из ISO-8859-1 нужно заменять на windows-1252. И все браузеры этому следует.
Что это значит, рассмотрим на примере:
<div id="div">€</div> <script> var div = document.getElementById("div"), char = div.firstChild.nodeValue, code = char.charCodeAt(0); console.log(code); // 8364 </script> |
Получается, что мы вывели символ с кодом 128
, а он заменился на 8364
. То есть, «терминальный символ, который использовался вместо евро», заменился на «настоящий Unicode-евро». Также ƒ
меняется на 402-й символ (знак функции).
То есть, даже если взять нормальный шрифт, поддерживающий Unicode (Universalia, например), в котором по 128-му коду нет никакого евро, всё равно вместо €
будет красоваться евро (но html-валидатор всё-таки выругается).
Тоже самое, если вставлять в DOM через JavaScript:
var div = document.createElement("div"); div.innerHTML = "€"; console.log(div.firstChild.nodeValue.charCodeAt(0)); // 8364 |
Но можно вставить непосредственно символ. Тогда всё нормально:
var div = document.createElement("div"), char = String.fromCharCode(128), text = document.createTextNode(char); div.appendChild(text); console.log(div.firstChild.nodeValue.charCodeAt(0)); // 128 |
Выводы и вопросы
1. Верстальщикам: евро, это не €
, а €
. А ещё лучше: €
.
2. Программистам: когда вам кажется, что из DOM должен прийти точно определённый символ — креститься надо.
3. Разработчикам Юникода: нахрена вам терминальные символы и почему столько мусора, а знака рубля нет?