HTML |
---|
Сравнения |
Хотя язык гипертекстовой разметки ( HTML ) используется с 1991 года, HTML 4.0 с декабря 1997 года стал первой стандартизированной версией, в которой международные символы получили достаточно полную обработку. Когда документ HTML включает специальные символы за пределами диапазона семибитного ASCII , стоит рассмотреть две цели: целостность информации и универсальное отображение в браузере .
Существует два основных способа указать, какая кодировка символов используется в документе.
Во-первых, веб-сервер может включить кодировку символов или « charset
» в заголовок протокола передачи гипертекста (HTTP) Content-Type
, который обычно выглядит следующим образом: [1]
Тип содержимого: text/html; кодировка=utf-8
Этот метод предоставляет HTTP-серверу удобный способ изменять кодировку документа в соответствии с согласованием содержимого ; определенное программное обеспечение HTTP-сервера может это делать, например Apache с модулем mod_charset_lite
. [2]
Во-вторых, декларация может быть включена в сам документ.
Для HTML можно включить эту информацию внутрь head
элемента в верхней части документа: [3]
< meta http-equiv = "Тип-контента" content = "text/html; charset=utf-8" >
HTML5 также допускает следующий синтаксис, который имеет то же значение: [3]
< meta charset = "utf-8" >
Документы XHTML имеют третий вариант: выразить кодировку символов с помощью XML- декларации следующим образом: [4]
<?xml версия="1.0" кодировка="utf-8"?>
При этом втором подходе, поскольку кодировка символов не может быть известна до тех пор, пока объявление не будет проанализировано, возникает проблема с знанием того, какая кодировка символов используется в документе вплоть до самого объявления. Если кодировка символов является расширением ASCII , то содержимое вплоть до самого объявления должно быть чистым ASCII, и это будет работать правильно. Для кодировок символов, которые не являются расширениями ASCII (т. е. не являются надмножеством ASCII), таких как UTF-16BE и UTF-16LE , процессор HTML, такой как веб-браузер, должен иметь возможность анализировать объявление в некоторых случаях с помощью эвристики.
Начиная с HTML5 рекомендуемой кодировкой является UTF-8 . [3] В спецификации определен «алгоритм анализа кодировки», позволяющий определить кодировку символов документа на основе нескольких источников входных данных, включая:
Символы за пределами печатного диапазона ASCII (от 32 до 126) обычно отображаются неправильно. Это представляет немного проблем для англоговорящих пользователей, но другие языки регулярно — в некоторых случаях всегда — требуют символы за пределами этого диапазона. В китайских, японских и корейских ( CJK ) языковых средах, где используются несколько различных многобайтовых кодировок, также часто используется автоматическое определение. Наконец, браузеры обычно позволяют пользователю вручную переопределять неверную метку набора символов.
Все чаще для многоязычных веб-сайтов и веб-сайтов на не-западных языках используется UTF-8 , что позволяет использовать одну и ту же кодировку для всех языков. UTF-16 или UTF-32 , которые также могут использоваться для всех языков, используются реже, поскольку их сложнее обрабатывать в языках программирования, предполагающих байтово-ориентированную надмножественную кодировку ASCII, и они менее эффективны для текста с высокой частотой символов ASCII, что обычно имеет место в документах HTML.
Успешный просмотр страницы не обязательно является признаком того, что ее кодировка указана правильно. Если создатель страницы и читатель оба предполагают некоторую специфичную для платформы кодировку символов, а сервер не отправляет никакой идентифицирующей информации, то читатель все равно увидит страницу так, как задумал создатель, но другие читатели на других платформах или с другими родными языками не увидят страницу так, как задумано.
Стандарт кодировки WHATWG , на который ссылаются недавние стандарты HTML (текущий WHATWG HTML Living Standard, а также ранее конкурирующие W3C HTML 5.0 и 5.1), определяет список кодировок, которые должны поддерживать браузеры. Стандарты HTML запрещают поддержку других кодировок. [6] [7] [8] Стандарт кодировки далее предусматривает, что новые форматы, новые протоколы (даже если используются существующие форматы) и авторы новых документов должны использовать исключительно UTF-8 . [9]
Помимо UTF-8, в самом стандарте HTML явно перечислены следующие кодировки со ссылкой на Стандарт кодирования: [8]
TIS-620
, ISO-8859-11
и связанных меток. [9]ASCII
, ISO-8859-1
и связанных меток. [9]ISO-8859-9
и связанных с ними меток. [9]UTF-16
метки, [21] хотя метка порядка байтов (BOM), если она присутствует, имеет приоритет над любой меткой. [22] Указано только для декодирования; отправка форм из документов в кодировке UTF-16 должна быть закодирована в UTF-8 . [20]В стандарте кодирования перечислены следующие дополнительные кодировки, поэтому их поддержка также требуется: [9]
KOI8-U
и KOI8-RU
; [9] следует за KOI8-RU в позициях 0xAE и 0xBE (т.е. включает Ў/ў ) [25] [26] но KOI8-U в позициях 0x93–9F. [25]GB2312
и связанных меток. Обрабатывается так же, как GB 18030 для целей декодирования. [27] Для целей кодирования маркировка как GBK (или GB 2312 ) исключает четырехбайтовые коды и отдает предпочтение однобайтовому представлению 0x80 для U+20AC. [10]Следующие кодировки перечислены как явные примеры запрещенных кодировок: [8]
Стандарт также определяет декодер «замены», который сопоставляет весь контент, помеченный как определенные кодировки, с символом замены (�), отказываясь обрабатывать его вообще. Это предназначено для предотвращения атак (например, межсайтового скриптинга ), которые могут использовать разницу между клиентом и сервером в том, какие кодировки поддерживаются, чтобы замаскировать вредоносный контент. [29] Хотя та же проблема безопасности применима к ISO-2022-JP и UTF-16 , которые также позволяют по-разному интерпретировать последовательности байтов ASCII, этот подход не был признан для них осуществимым, поскольку они сравнительно чаще используются в развернутом контенте. [30] Следующие кодировки получают такую обработку: [31]
В дополнение к собственным кодировкам символов, символы также могут быть закодированы как ссылки на символы , которые могут быть числовыми ссылками на символы ( десятичными или шестнадцатеричными ) или ссылками на сущности символов . Ссылки на сущности символов также иногда называют именованными сущностями или сущностями HTML для HTML. Использование ссылок на символы в HTML происходит от SGML .
Числовая ссылка на символ в HTML ссылается на символ по его универсальному набору символов / кодовой точке Unicode и использует формат
&#nnnn;
или
&#xhhhh;
где nnnn — это кодовая точка в десятичной форме, а hhhh — это кодовая точка в шестнадцатеричной форме. В XML-документах x должен быть строчным. nnnn или hhhh могут быть любым количеством цифр и могут включать начальные нули. hhhh может смешивать заглавные и строчные буквы, хотя заглавные буквы являются обычным стилем.
Не все веб-браузеры или почтовые клиенты, используемые получателями HTML-документов, или текстовые редакторы, используемые авторами HTML-документов, смогут отобразить все символы HTML. Большинство современных программ способны отображать большинство или все символы для языка пользователя и будут рисовать рамку или другой понятный индикатор для символов, которые они не могут отобразить.
Для кодов от 0 до 127, исходного 7-битного стандартного набора ASCII , большинство этих символов можно использовать без ссылки на символ. Коды от 160 до 255 можно создать с использованием имен сущностей символов . Только несколько кодов с более высокими номерами можно создать с использованием имен сущностей, но все они могут быть созданы с использованием ссылки на символ десятичного числа.
Ссылки на сущности символов также могут иметь формат , в котором имя — это чувствительная к регистру буквенно-цифровая строка. Например, «λ» также может быть закодировано как в документе HTML. Ссылки на сущности символов , , и предопределены в HTML и SGML, поскольку , , и уже используются для разграничения разметки. Это, в частности, не включало сущность XML (') до HTML5 . Список всех ссылок на сущности символов HTML вместе с версиями, в которых они были введены, см. в разделе Список ссылок на сущности символов XML и HTML .&name;
λ
<
>
"
&
<
>
"
&
'
Ненужное использование ссылок на символы HTML может значительно снизить читабельность HTML. Если кодировка символов для веб-страницы выбрана правильно, то ссылки на символы HTML обычно требуются только для символов-разделителей разметки, как указано выше, и для нескольких специальных символов (или вообще не требуются, если используется собственная кодировка Unicode, например UTF-8 ). Неправильное экранирование сущностей HTML также может открыть уязвимости безопасности для атак с внедрением, таких как межсайтовый скриптинг . Если атрибуты HTML не заключены в кавычки, некоторые символы, в первую очередь пробелы , такие как пробел и табуляция, должны быть экранированы с помощью сущностей. Другие языки, связанные с HTML, имеют свои собственные методы экранирования символов.
В отличие от традиционного HTML с его большим диапазоном ссылок на сущности символов, в XML есть только пять предопределенных ссылок на сущности символов. Они используются для экранирования символов, которые чувствительны к разметке в определенных контекстах: [32]
& | & | амперсанд | U+0026 |
< | < | знак «меньше» | U+003C |
> | > | знак «больше» | U+003E |
" | " | кавычка | U+0022 |
' | ' | апостроф | U+0027 |
Все остальные ссылки на сущности символов должны быть определены до того, как их можно будет использовать. Например, использование é
(что дает é, латинскую строчную букву E с острым ударением, U+00E9 в Unicode) в документе XML приведет к ошибке, если только сущность еще не определена. XML также требует, чтобы x
шестнадцатеричные числовые ссылки были в нижнем регистре: например, ਛ
а не ਛ
. XHTML , который является приложением XML, поддерживает набор сущностей HTML, а также предопределенные сущности XML.