Кодировки символов в HTML
HTML |
---|
Сравнения |
Хотя язык разметки гипертекста ( HTML ) используется с 1991 года, HTML 4.0, вышедший в декабре 1997 года, стал первой стандартизированной версией, в которой международным символам была предоставлена достаточно полная обработка. Когда HTML-документ содержит специальные символы вне диапазона семибитного ASCII информации , стоит учитывать две цели: целостность и универсальное в браузере отображение .
Указание кодировки символов документа
[ редактировать ]Существует два основных способа указать, какая кодировка символов используется в документе.
Во-первых, веб-сервер может включать кодировку символов или " charset
" в протоколе передачи гипертекста (HTTP) Content-Type
заголовок, который обычно выглядит так: [1]
Content-Type: text/html; charset=utf-8
Этот метод дает HTTP-серверу удобный способ изменить кодировку документа в соответствии с согласованием содержимого ; определенное программное обеспечение HTTP-сервера может это сделать, например Apache с модулем mod_charset_lite
. [2]
Во-вторых, декларация может быть включена в сам документ.
Для HTML можно включить эту информацию внутри head
элемент в верхней части документа: [3]
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
HTML5 также позволяет следующему синтаксису означать то же самое: [3]
<meta charset="utf-8">
У документов XHTML есть третий вариант: выразить кодировку символов через объявление XML следующим образом: [4]
<?xml version="1.0" encoding="utf-8"?>
При использовании этого второго подхода, поскольку кодировка символов не может быть известна до тех пор, пока не будет проанализировано объявление, возникает проблема с определением того, какая кодировка символов используется в документе, включая само объявление. Если кодировка символов является расширением ASCII , то содержимое до самого объявления включительно должно быть чистым ASCII, и это будет работать правильно. Для кодировок символов, которые не являются расширениями ASCII (т. е. не являются надмножеством ASCII), например UTF-16BE и UTF-16LE , процессор HTML, например веб-браузер, должен иметь возможность анализировать объявление в некоторых случаях через использование эвристики.
Алгоритм обнаружения кодировки
[ редактировать ]Начиная с HTML5, рекомендуемая кодировка — UTF-8 . [3] В спецификации определен «алгоритм анализа кодировки» для определения кодировки символов документа на основе нескольких источников входных данных, включая:
- Явные инструкции пользователя
- Явный метатег в первых 1024 байтах документа.
- Метка порядка байтов (BOM) в первых трех байтах документа.
- HTTP Content-Type или другая информация транспортного уровня.
- Анализ байтов документа в поисках определенных последовательностей или диапазонов значений байтов, [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]
- ИСО-8859-2
- ИСО-8859-7
- ИСО-8859-8
- Windows-874 [а]
- Windows-1250
- Windows-1251
- Windows-1252 [б]
- Windows-1254 [с]
- Windows-1255
- Windows-1256
- Windows-1257
- Windows-1258
- ГБ 18030 [д]
- Большой5 [и]
- Сдвиг JIS [ф]
- ISO-2022-JP [г]
- EUC-КР [час]
- UTF-16BE [я]
- UTF-16LE [Дж]
- x-определяемый пользователем [к]
- ^ Также указано для
TIS-620
,ISO-8859-11
и соответствующие этикетки. [9] - ^ Также указано для
ASCII
,ISO-8859-1
и соответствующие этикетки. [9] - ^ Также указано для
ISO-8859-9
и соответствующие этикетки. [9] - ^ Указывается с 0xA3A0 как дублирующая кодировка идеографического пространства (U+3000) по соображениям совместимости и, как таковая, исключая U+E5E5 (символ частного использования). [10] [11] Также указывается значение 0x80, принятое в качестве альтернативной кодировки знака евро (U+20AC; см. Windows-936 ). [12] В противном случае следует сопоставления из стандарта 2005 года. [11]
- ^ дополнительного набора символов Гонконга , Вариант [13] хотя большинство расширений HKSCS (с ведущими байтами меньше 0xA1) не включаются кодером, а только декодером. [14]
- ^ Спецификация включает расширения IBM и NEC , [15] а точнее Windows-31J . [13]
- ^ В спецификации используется тот же индекс, что и для Shift JIS (насколько это возможно), т. е. включены расширения NEC. Кана половинной ширины преобразуется кодировщиком в полную ширину. [16] но принимается декодером с использованием escape-последовательности (ESC 0x28 0x49). [17] Shift Out и Shift In (0x0E и 0x0F) полностью исключены для предотвращения атак. [17] [18]
- ^ Фактически унифицированный код хангыля (Windows-949), который представляет собой расширенный набор, охватывающий весь блок слогов хангыля . [13] [19]
- ^ Указан только для декодирования; Отправка форм из документов с кодировкой UTF-16 должна быть закодирована в UTF-8 . [20]
- ^ Для совместимости с развернутым контентом также указано для простого
UTF-16
этикетка, [21] хотя метка порядка байтов (BOM), если она присутствует, имеет приоритет над любой меткой. [22] Указан только для декодирования; Отправка форм из документов с кодировкой UTF-16 должна быть закодирована в UTF-8 . [20] - ^ Сопоставляет 0x00–0x7F с U+0000–U+007F и 0x80–0xFF с U+F780–U+F7FF ( диапазон области частного использования ), так что младшие 8 бит кодовой точки всегда соответствуют исходному байту. [23]
Следующие дополнительные кодировки перечислены в Стандарте кодирования, поэтому их поддержка также требуется: [9]
- ^ Использует тот же кодер и декодер, что и ISO-8859-8, но не подчиняется поведению визуального порядка, которое используется для документов, помеченных как ISO-8859-8. [24]
- ^ Назван КОИ8-У и указан для обоих.
KOI8-U
иKOI8-RU
этикетки; [9] следует за KOI8-RU в позициях 0xAE и 0xBE (т.е. включает Ў/ў ) [25] [26] но КОИ8-У в позициях 0x93–9F. [25] - ^ Также указано для
GB2312
и соответствующие этикетки. обрабатывается так же, как GB 18030 . В целях декодирования [27] В целях кодирования маркировка GBK (или GB 2312 ) исключает четырехбайтовые коды и отдает предпочтение однобайтовому представлению 0x80 для U+20AC. [10] - ^ В спецификации используется тот же индекс, что и для 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 могут быть созданы с использованием имен символьных объектов . Лишь несколько кодов с более высокими номерами могут быть созданы с использованием имен объектов, но все они могут быть созданы с помощью ссылки на символ десятичных чисел.
Ссылки на символьные сущности также могут иметь формат &name;
где имя — буквенно-цифровая строка с учетом регистра. Например, «λ» также можно закодировать как λ
в HTML-документе. Ссылки на сущность персонажа <
, >
, "
и &
предопределены в HTML и SGML, поскольку <
, >
, "
и &
уже используются для разграничения разметки. В частности, это не включало XML '
(') объект до HTML5 . Список всех именованных ссылок на символьные сущности HTML вместе с версиями, в которых они были представлены, см. в разделе Список ссылок на символьные сущности XML и HTML .
Ненужное использование ссылок на символы HTML может значительно ухудшить читаемость HTML. Если кодировка символов для веб-страницы выбрана правильно, то ссылки на символы HTML обычно требуются только для символов-разделителей разметки, как указано выше, а также для нескольких специальных символов (или вообще не требуется, если Unicode, собственная кодировка такая как UTF-8). используется ). Неправильное экранирование объекта HTML также может открыть уязвимости безопасности для атак путем внедрения, таких как межсайтовый скриптинг . Если атрибуты HTML не заключены в кавычки, некоторые символы, особенно пробелы , такие как пробел и табуляция, должны быть экранированы с помощью сущностей. Другие языки, связанные с HTML, имеют свои собственные методы экранирования символов.
Ссылки на символы XML
[ редактировать ]В отличие от традиционного HTML с его большим диапазоном ссылок на символьные сущности, в XML имеется только пять предопределенных ссылок на символьные сущности. Они используются для экранирования символов, чувствительных к разметке в определенных контекстах: [32]
& |
& | амперсанд | U + 0026 |
< |
< | знак меньше чем | U + 003C |
> |
> | знак «больше» | U + 003E |
" |
" | кавычка | U + 0022 |
' |
' | апостроф | U + 0027 |
Все остальные ссылки на сущности символов должны быть определены, прежде чем их можно будет использовать. Например, использование é
(что дает é, латинскую строчную букву E с острым ударением, U+00E9 в Юникоде) в XML-документе выдаст ошибку, если сущность еще не определена. XML также требует, чтобы x
в шестнадцатеричных числовых ссылках быть в нижнем регистре: например ਛ
скорее, чем ਛ
. XHTML , являющийся приложением XML, поддерживает набор сущностей HTML, а также предопределенные сущности XML.
См. также
[ редактировать ]- Анализ набора символов — используется многими браузерами, когда метаданные кодировки символов недоступны.
- Юникод и HTML
- Код языка
- Список ссылок на символьные сущности XML и HTML
Ссылки
[ редактировать ]- ^ Филдинг, Р.; Решке, Дж. (июнь 2014 г.), «Тип контента» , в Филдинге, Р.; Решке, Дж. (ред.), Протокол передачи гипертекста (HTTP/1.1): Семантика и контент , IETF , doi : 10.17487/RFC7231 , S2CID 14399078 , получено 30 июля 2014 г.
- ^ «Модуль Apache mod_charset_lite» .
- ^ Перейти обратно: а б с «Указание кодировки символов документа» , HTML5 , Консорциум World Wide Web , 14 декабря 2017 г. , дата обращения 28 мая 2018 г.
- ^ Брей, Т .; Паоли, Дж.; Сперберг-МакКуин, К .; Малер, Э.; Йерго, Ф. (26 ноября 2008 г.), «Пролог и объявление типа документа» , XML , W3C , получено 8 марта 2010 г.
- ^ «HTML5 предварительно сканирует поток байтов, чтобы определить его кодировку» .
- ^ «8.2.2.3. Кодировки символов» . Стандарт HTML 5.1 . W3C.
- ^ «8.2.2.3. Кодировки символов» . Стандарт HTML5 . W3C.
- ^ Перейти обратно: а б с «12.2.3.3 Кодировки символов» . HTML Уровень жизни . ЧТОРГ.
- ^ Перейти обратно: а б с д и ж ван Кестерен, Энн . «4.2: Имена и метки» . Стандарт кодирования . ЧТОРГ .
- ^ Перейти обратно: а б ван Кестерен, Энн . «10.2.2. Кодер gb18030» . Стандарт кодирования . ЧТОРГ .
- ^ Перейти обратно: а б ван Кестерен, Энн . «5. Индексы (§ index gb18030)» . Стандарт кодирования . ЧТОРГ .
- ^ ван Кестерен, Энн . «10.2.1. декодер gb18030» . Стандарт кодирования . ЧТОРГ .
- ^ Перейти обратно: а б с Фонд Мозилла . «Заметные отличия от именования IANA» . Создайте файлcoding_rs . документы.рс.
- ^ ван Кестерен, Энн . «5. Индексы (§ указатель индекса Big5)» . Стандарт кодирования . ЧТОРГ .
- ^ ван Кестерен, Энн . «5. Индексы (§ Индекс jis0208)» . Стандарт кодирования . ЧТОРГ .
- ^ ван Кестерен, Энн . «5. Индексы (§ Индекс ISO-2022-JP катакана)» . Стандарт кодирования . ЧТОРГ .
- ^ Перейти обратно: а б ван Кестерен, Энн . «12.2.1. Декодер ISO-2022-JP» . Стандарт кодирования . ЧТОРГ .
- ^ ван Кестерен, Энн . «12.2.2. Кодер ISO-2022-JP» . Стандарт кодирования . ЧТОРГ .
- ^ ван Кестерен, Энн . «5. Индексы (§ индекс EUC-KR)» . Стандарт кодирования . ЧТОРГ .
- ^ Перейти обратно: а б ван Кестерен, Энн . «4.3. Кодировки вывода» . Стандарт кодирования . ЧТОРГ .
- ^ ван Кестерен, Энн . «14.4. UTF-16LE» . Стандарт кодирования . ЧТОРГ .
- ^ ван Кестерен, Энн . «6. Хуки для стандартов (§ декодирование)» . Стандарт кодирования . ЧТОРГ .
- ^ ван Кестерен, Энн . «14.5.x-определяется пользователем» . Стандарт кодирования . ЧТОРГ .
- ^ ван Кестерен, Энн . «9. Устаревшие однобайтовые кодировки (§ Примечание)» . Стандарт кодирования . ЧТОРГ .
- ^ Перейти обратно: а б ван Кестерен, Энн . «индексная визуализация КОИ8-У» . Стандарт кодирования . ЧТОРГ .
- ^ «Ошибка 17053: Поддержка сопоставления KOI8-RU для KOI8-U» . W3C Багзилла . 19 августа 2015 г.
- ^ ван Кестерен, Энн . «10.1. ГБК» . Стандарт кодирования . ЧТОРГ .
- ^ ван Кестерен, Энн . «5. Индексы (§ Индекс jis0212)» . Стандарт кодирования . ЧТОРГ .
- ^ ван Кестерен, Энн . «14.1: замена» . Стандарт кодирования . ЧТОРГ .
- ^ ван Кестерен, Энн . «2: Фон безопасности» . Стандарт кодирования . ЧТОРГ .
- ^ ван Кестерен, Энн . «4.2: Названия и метки (§ замена)» . Стандарт кодирования . ЧТОРГ .
- ^ Брей, Т .; Паоли, Дж.; Сперберг-МакКуин, К .; Малер, Э.; Йерго, Ф. (26 ноября 2008 г.), «Ссылки на символы и сущности» , XML , W3C , получено 8 марта 2010 г.
Внешние ссылки
[ редактировать ]- Онлайн-инструмент для кодирования и декодера HTML-объектов
- Ссылки на символьные сущности в HTML4
- Полное руководство по кодированию веб-символов
- Глава «Кодирование объектов HTML» в Руководстве по безопасности браузера — дополнительная информация о текущих браузерах и обработке их объектов.
- Вики-статья проекта Open Web Application Security Project о межсайтовом сценарии (XSS)