Кодировки символов в HTML

Использование систем кодирования международных символов в 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] В спецификации определен «алгоритм анализа кодировки», позволяющий определить кодировку символов документа на основе нескольких источников входных данных, включая:

  1. Явные инструкции для пользователя
  2. Явный метатег в первых 1024 байтах документа
  3. Метка порядка байтов (BOM) в первых трех байтах документа
  4. HTTP Content-Type или другая информация транспортного уровня
  5. Анализ байтов документа с целью поиска определенных последовательностей или диапазонов значений байтов [5] и других предварительных механизмов обнаружения.

Символы за пределами печатного диапазона 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]

  1. ^ Также указано для TIS-620, ISO-8859-11и связанных меток. [9]
  2. ^ Также указано для ASCII, ISO-8859-1и связанных меток. [9]
  3. ^ Также указано для ISO-8859-9и связанных с ними меток. [9]
  4. ^ Указано с 0xA3A0 как дублирующая кодировка идеографического пространства (U+3000) по соображениям совместимости, и как таковое исключает U+E5E5 (символ частного использования). [10] [11] Также указано с 0x80, принятым как альтернативная кодировка знака евро (U+20AC; см. Windows-936 ). [12] В противном случае следует сопоставлениям из стандарта 2005 года. [11]
  5. ^ Вариант дополнительного набора символов Гонконга , [13] хотя большинство расширений HKSCS (со старшими байтами меньше 0xA1) не включены кодером, а включены только декодером. [14]
  6. ^ Спецификация включает расширения IBM и NEC , [15] и точнее Windows-31J . [13]
  7. ^ В спецификации используется тот же индекс, что и для Shift JIS (насколько это возможно), т.е. включены расширения NEC. Кана половинной ширины преобразуется кодером в полную ширину, [16] но принимается с использованием escape-последовательности (ESC 0x28 0x49) декодером. [17] Shift Out и Shift In (0x0E и 0x0F) полностью исключены для предотвращения атак. [17] [18]
  8. ^ Фактически унифицированный код хангыль (Windows-949), который является надмножеством, охватывающим весь блок слогов хангыль . [13] [19]
  9. ^ Указано только для декодирования; формы, отправляемые из документов в кодировке UTF-16, должны быть закодированы в UTF-8 . [20]
  10. ^ Для совместимости с развернутым содержимым также указано для простой UTF-16метки, [21] хотя метка порядка байтов (BOM), если она присутствует, имеет приоритет над любой меткой. [22] Указано только для декодирования; отправка форм из документов в кодировке UTF-16 должна быть закодирована в UTF-8 . [20]
  11. ^ Отображает 0x00 через 0x7F в U+0000 через U+007F и 0x80 через 0xFF в U+F780 через U+F7FF ( диапазон частной области использования ), так что нижние 8 бит кодовой точки всегда соответствуют исходному байту. [23]

В стандарте кодирования перечислены следующие дополнительные кодировки, поэтому их поддержка также требуется: [9]

  1. ^ Использует тот же кодер и декодер, что и ISO-8859-8, но не подчиняется поведению визуального порядка, которое используется для документов, помеченных как ISO-8859-8. [24]
  2. ^ Назван KOI8-U и указан для обеих меток KOI8-Uи KOI8-RU; [9] следует за KOI8-RU в позициях 0xAE и 0xBE (т.е. включает Ў/ў ) [25] [26] но KOI8-U в позициях 0x93–9F. [25]
  3. ^ Также указано для GB2312и связанных меток. Обрабатывается так же, как GB 18030 для целей декодирования. [27] Для целей кодирования маркировка как GBK (или GB 2312 ) исключает четырехбайтовые коды и отдает предпочтение однобайтовому представлению 0x80 для U+20AC. [10]
  4. ^ В спецификации используется тот же индекс, что и для Shift JIS (насколько это находится в пределах досягаемости набора кодов EUC 1), т.е. включает расширения NEC. JIS X 0212 включен только для декодирования. [28]

Следующие кодировки перечислены как явные примеры запрещенных кодировок: [8]

Стандарт также определяет декодер «замены», который сопоставляет весь контент, помеченный как определенные кодировки, с символом замены (�), отказываясь обрабатывать его вообще. Это предназначено для предотвращения атак (например, межсайтового скриптинга ), которые могут использовать разницу между клиентом и сервером в том, какие кодировки поддерживаются, чтобы замаскировать вредоносный контент. [29] Хотя та же проблема безопасности применима к ISO-2022-JP и UTF-16 , которые также позволяют по-разному интерпретировать последовательности байтов ASCII, этот подход не был признан для них осуществимым, поскольку они сравнительно чаще используются в развернутом контенте. [30] Следующие кодировки получают такую ​​обработку: [31]

Ссылки на персонажей

В дополнение к собственным кодировкам символов, символы также могут быть закодированы как ссылки на символы , которые могут быть числовыми ссылками на символы ( десятичными или шестнадцатеричными ) или ссылками на сущности символов . Ссылки на сущности символов также иногда называют именованными сущностями или сущностями HTML для HTML. Использование ссылок на символы в HTML происходит от SGML .

Ссылки на символы HTML

Числовая ссылка на символ в 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;&lambda;&lt;&gt;&quot;&amp;<>"&&apos;

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

Ссылки на символы XML

В отличие от традиционного HTML с его большим диапазоном ссылок на сущности символов, в XML есть только пять предопределенных ссылок на сущности символов. Они используются для экранирования символов, которые чувствительны к разметке в определенных контекстах: [32]

&amp;&амперсандU+0026
&lt;<знак «меньше»U+003C
&gt;>знак «больше»U+003E
&quot;"кавычкаU+0022
&apos;'апострофU+0027

Все остальные ссылки на сущности символов должны быть определены до того, как их можно будет использовать. Например, использование &eacute;(что дает é, латинскую строчную букву E с острым ударением, U+00E9 в Unicode) в документе XML приведет к ошибке, если только сущность еще не определена. XML также требует, чтобы xшестнадцатеричные числовые ссылки были в нижнем регистре: например, &#xA1bа не &#XA1b. XHTML , который является приложением XML, поддерживает набор сущностей HTML, а также предопределенные сущности XML.

Смотрите также

Ссылки

  1. ^ Fielding, R.; Reschke, J. (июнь 2014 г.), "Content-Type", в Fielding, R; Reschke, J (ред.), Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content , IETF , doi :10.17487/RFC7231, S2CID  14399078 , получено 30 июля 2014 г.
  2. ^ "Модуль Apache mod_charset_lite".
  3. ^ abc "Указание кодировки символов документа", HTML5 , World Wide Web Consortium , 14 декабря 2017 г. , получено 28 мая 2018 г.
  4. ^ Брей, Т .; Паоли, Дж.; Сперберг-Маккуин, К .; Малер, Э.; Йерго, Ф. (26 ноября 2008 г.), «Пролог и декларация типа документа», XML , W3C , дата обращения 8 марта 2010 г.
  5. ^ «HTML5 предварительно сканирует поток байтов для определения его кодировки».
  6. ^ "8.2.2.3. Кодировки символов". Стандарт HTML 5.1 . W3C.
  7. ^ "8.2.2.3. Кодировки символов". Стандарт HTML 5. W3C.
  8. ^ abc "12.2.3.3 Кодировки символов". HTML Living Standard . WHATWG.
  9. ^ abcdef ван Кестерен, Энн . «4.2: Имена и метки». Стандарт кодирования . ЧТОРГ .
  10. ^ Аб ван Кестерен, Энн . «Кодер 10.2.2. gb18030». Стандарт кодирования . ЧТОРГ .
  11. ^ Аб ван Кестерен, Энн . «5. Индексы (§ индекс gb18030)». Стандарт кодирования . ЧТОРГ .
  12. ^ ван Кестерен, Энн . «10.2.1. декодер gb18030». Стандарт кодирования . ЧТОРГ .
  13. ^ abc Mozilla Foundation . "Значительные отличия от именования IANA". Crate encoding_rs . docs.rs.
  14. ^ ван Кестерен, Энн . «5. Индексы (§ указатель индекса Big5)». Стандарт кодирования . ЧТОРГ .
  15. ^ ван Кестерен, Энн . «5. Индексы (§ Индекс jis0208)». Стандарт кодирования . ЧТОРГ .
  16. ^ ван Кестерен, Энн . «5. Индексы (§ Индекс ISO-2022-JP катакана)». Стандарт кодирования . ЧТОРГ .
  17. ^ Аб ван Кестерен, Энн . «12.2.1. Декодер ISO-2022-JP». Стандарт кодирования . ЧТОРГ .
  18. ^ ван Кестерен, Энн . «12.2.2. Кодер ISO-2022-JP». Стандарт кодирования . ЧТОРГ .
  19. ^ ван Кестерен, Энн . «5. Индексы (§ индекс EUC-KR)». Стандарт кодирования . ЧТОРГ .
  20. ^ Аб ван Кестерен, Энн . «4.3. Кодировки вывода». Стандарт кодирования . ЧТОРГ .
  21. ^ ван Кестерен, Энн . «14.4. UTF-16LE». Стандарт кодирования . ЧТОРГ .
  22. ^ ван Кестерен, Энн . «6. Хуки для стандартов (§ декодирование)». Стандарт кодирования . ЧТОРГ .
  23. ^ ван Кестерен, Энн . «14.5.x-определяется пользователем». Стандарт кодирования . ЧТОРГ .
  24. ^ ван Кестерен, Энн . «9. Устаревшие однобайтовые кодировки (§ Примечание)». Стандарт кодирования . ЧТОРГ .
  25. ^ Аб ван Кестерен, Энн . «Индексная визуализация КОИ8-У». Стандарт кодирования . ЧТОРГ .
  26. ^ "Ошибка 17053: Поддержка сопоставления KOI8-RU для KOI8-U". W3C Bugzilla . 19 августа 2015 г.
  27. ^ ван Кестерен, Энн . «10.1. ГБК». Стандарт кодирования . ЧТОРГ .
  28. ^ ван Кестерен, Энн . «5. Индексы (§ Индекс jis0212)». Стандарт кодирования . ЧТОРГ .
  29. ^ ван Кестерен, Энн . «14.1: замена». Стандарт кодирования . ЧТОРГ .
  30. ^ ван Кестерен, Энн . «2: Фон безопасности». Стандарт кодирования . ЧТОРГ .
  31. ^ ван Кестерен, Энн . «4.2: Названия и метки (§ замена)». Стандарт кодирования . ЧТОРГ .
  32. ^ Брей, Т .; Паоли, Дж.; Сперберг-Маккуин, К .; Малер, Э.; Йерго, Ф. (26 ноября 2008 г.), «Ссылки на символы и сущности», XML , W3C , дата обращения 8 марта 2010 г.
  • Онлайн-инструмент для кодирования и декодирования HTML-сущностей
  • Ссылки на сущности символов в HTML4
  • Полное руководство по кодировке веб-символов
  • Глава «Кодирование сущностей HTML» в «Справочнике по безопасности браузеров» — дополнительная информация о современных браузерах и их обработке сущностей
  • Статья в вики проекта Open Web Application Security Project о межсайтовом скриптинге (XSS)
Retrieved from "https://en.wikipedia.org/w/index.php?title=Character_encodings_in_HTML&oldid=1250834828#Character_references"