Кодировки символов в HTML - Character encodings in HTML

HTML (Язык гипертекстовой разметки) используется с 1991 года, но HTML 4.0 (декабрь 1997 года) был первой стандартизированной версией, в которой символы получили достаточно полное лечение. Когда HTML-документ включает специальные символы вне семибитного диапазона ASCII, стоит рассмотреть две цели: информационная честность, и универсальный браузер отображать.

Указание кодировки символов документа

Есть несколько способов указать, какая кодировка символов используется в документе. Во-первых, веб сервер может включать кодировку символов или "кодировка" в Протокол передачи гипертекста (HTTP) Тип содержимого заголовок, который обычно выглядит так:[1]

Content-Type: текст / html; charset = ISO-8859-4

Этот метод дает HTTP-серверу удобный способ изменить кодировку документа в соответствии с согласование содержания; определенное программное обеспечение HTTP-сервера может это сделать, например Apache с модуль mod_charset_lite.[2]

Для HTML эту информацию можно включить в голова элемент в верхней части документа:[3]

<мета http-Equiv="Тип содержимого" содержание="текст / html; charset = utf-8">

HTML5 также позволяет следующий синтаксис означать то же самое:[3]

<мета кодировка=«УТФ-8»>

XHTML у документов есть третий вариант: выразить кодировку символов через XML декларация следующего содержания:[4]

<?xml version="1.0" encoding="ISO-8859-1"?>

Поскольку кодировка символов не может быть известна до этого[требуется разъяснение ] объявление анализируется, может возникнуть проблема, зная, какая кодировка используется для самого объявления. Главный принцип заключается в том, что объявление должно быть закодировано в чистом ASCII, и поэтому (если объявление находится внутри файла) кодировка должна быть Расширение ASCII. Для того чтобы кодировки не были обратно совместимы с ASCII, браузеры должны иметь возможность анализировать объявления в таких кодировках. Примеры таких кодировок: UTF-16BE и UTF-16LE.

Начиная с HTML5 рекомендуемая кодировка UTF-8.[3] В спецификации определен «алгоритм сниффинга кодирования» для определения кодировки символов документа на основе нескольких источников ввода, включая:

  1. Явная инструкция пользователя
  2. Явный метатег в первых 1024 байтах документа.
  3. А Отметка порядка байтов в пределах первых трех байтов документа
  4. Тип содержимого HTTP или другая информация транспортного уровня
  5. Анализ байтов документа на предмет определенных последовательностей или диапазонов значений байтов,[5] и другие механизмы предварительного обнаружения.

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

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

  1. ^ Использует тот же кодировщик и декодер, что и ISO-8859-8, но не подчиняется поведению визуального порядка, которое используется для документов, помеченных как ISO-8859-8.[23]
  2. ^ Также указано для GB2312 и связанные ярлыки. Для декодирования обрабатывается так же, как GB18030.[24] Для целей кодирования маркировка как GBK (или GB2312) исключает четырехбайтовые коды и отдает предпочтение однобайтовому представлению 0x80 для U + 20AC.[10]
  3. ^ В спецификации используется тот же индекс, что и для Shift JIS (поскольку он находится в пределах досягаемости набора кодов EUC 1), то есть включает расширения NEC. JIS X 0212 включен только для декодирования.[25]

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

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

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

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

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

А ссылка на числовой символ в HTML относится к символу по его Универсальный набор символов /Unicode кодовая точка, и использует формат

&#nnnn;

или же

&#Иксхххх;

куда nnnn это кодовая точка в десятичный форма, и хххх это кодовая точка в шестнадцатеричный форма. В Икс в XML-документах должен быть строчным. В nnnn или же хххх может быть любым количеством цифр и может включать в себя ведущие нули. В хххх может смешивать прописные и строчные буквы, хотя прописные буквы являются обычным стилем.

Не все веб-браузеры или же почтовые клиенты используется получателями HTML-документов, или текстовые редакторы используется авторами документов HTML, сможет отображать все символы HTML. Большинство современных программ способно отображать большинство или все символы языка пользователя, а также рисовать прямоугольник или другой четкий индикатор для символов, которые они не могут отобразить.

Для кодов от 0 до 127 исходный 7-битный ASCII стандартный набор, большинство этих символов можно использовать без ссылки на символ. Все коды от 160 до 255 могут быть созданы с помощью имена персонажей. Только несколько кодов с более высокими номерами могут быть созданы с использованием имен сущностей, но все они могут быть созданы с помощью ссылки на символ десятичного числа.

Ссылки на символьные сущности также могут иметь формат &имя; куда имя представляет собой буквенно-цифровую строку с учетом регистра. Например, «λ» также может быть закодировано как & лямбда; в HTML-документе. Ссылки на сущность персонажа & lt;, & gt;, & quot; и & amp; предопределены в HTML и SGML, потому что <, >, " и & уже используются для разграничения разметки. В частности, это не включало XML & апос; (') сущность до HTML5. Для получения списка всех названных ссылок на сущности символов HTML вместе с версиями, в которых они были представлены, см. Список ссылок на символьные сущности XML и HTML.

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

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

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

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

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

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

Рекомендации

  1. ^ "Тип содержимого", Протокол передачи гипертекста (HTTP / 1.1): семантика и содержание, IETF, Июнь 2014 г., получено 30 июля 2014
  2. ^ Модуль Apache mod_charset_lite
  3. ^ а б c «Указание кодировки символов документа», HTML5, Консорциум World Wide Web, 14 декабря 2017, получено 28 мая 2018
  4. ^ Брей, Т.; Paoli, J .; Сперберг-Маккуин, К.; Maler, E .; Йерго, Ф. (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. ^ а б c «12.2.3.3 Кодировки символов». Уровень жизни HTML. WHATWG.
  9. ^ а б c d е ван Кестерен, Энн. «4.2: Имена и ярлыки». Стандарт кодирования. WHATWG.
  10. ^ а б ван Кестерен, Энн. "10.2.2. Энкодер gb18030". Стандарт кодирования. WHATWG.
  11. ^ а б ван Кестерен, Энн. "5. Указатели (§ индекс gb18030)". Стандарт кодирования. WHATWG.
  12. ^ ван Кестерен, Энн. "10.2.1. Gb18030 декодер". Стандарт кодирования. WHATWG.
  13. ^ ван Кестерен, Энн. "5. Индексы (§ указатель Big5 index)". Стандарт кодирования. WHATWG.
  14. ^ ван Кестерен, Энн. "5. Указатели (§ Указатель jis0208)". Стандарт кодирования. WHATWG.
  15. ^ ван Кестерен, Энн. «5. Указатели (§ Указатель ISO-2022-JP katakana)». Стандарт кодирования. WHATWG.
  16. ^ а б ван Кестерен, Энн. «12.2.1. Декодер ISO-2022-JP». Стандарт кодирования. WHATWG.
  17. ^ ван Кестерен, Энн. «12.2.2. Кодировщик ISO-2022-JP». Стандарт кодирования. WHATWG.
  18. ^ ван Кестерен, Энн. «5. Индексы (§ индекс EUC-KR)». Стандарт кодирования. WHATWG.
  19. ^ а б ван Кестерен, Энн. «4.3. Выходные кодировки». Стандарт кодирования. WHATWG.
  20. ^ ван Кестерен, Энн. «14.4. UTF-16LE». Стандарт кодирования. WHATWG.
  21. ^ ван Кестерен, Энн. «6. Крючки для стандартов (§ декодирование)». Стандарт кодирования. WHATWG.
  22. ^ ван Кестерен, Энн. "14.5. X-определяемый пользователем". Стандарт кодирования. WHATWG.
  23. ^ ван Кестерен, Энн. «9. Устаревшие однобайтовые кодировки (§ Примечание)». Стандарт кодирования. WHATWG.
  24. ^ ван Кестерен, Энн. «10.1. ГБК». Стандарт кодирования. WHATWG.
  25. ^ ван Кестерен, Энн. "5. Указатели (§ Указатель jis0212)". Стандарт кодирования. WHATWG.
  26. ^ ван Кестерен, Энн. «14.1: замена». Стандарт кодирования. WHATWG.
  27. ^ ван Кестерен, Энн. «2: Фон безопасности». Стандарт кодирования. WHATWG.
  28. ^ ван Кестерен, Энн. «4.2: Имена и ярлыки (§ замена)». Стандарт кодирования. WHATWG.
  29. ^ Брей, Т.; Paoli, J .; Сперберг-Маккуин, К.; Maler, E .; Йерго, Ф. (26 ноября 2008 г.), «Ссылки на персонажей и сущностей», XML, W3C, получено 8 марта 2010

внешняя ссылка