WikiDer > Кодировки символов в HTML
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] В спецификации определен «алгоритм сниффинга кодирования» для определения кодировки символов документа на основе нескольких источников ввода, включая:
- Явная инструкция пользователя
- Явный метатег в первых 1024 байтах документа.
- А Отметка порядка байтов в пределах первых трех байтов документа
- Тип содержимого HTTP или другая информация транспортного уровня
- Анализ байтов документа на предмет определенных последовательностей или диапазонов значений байтов,[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]
- ^ Также указано для
ТИС-620
,ISO-8859-11
и связанные ярлыки.[9] - ^ Также указано для
ASCII
,ISO-8859-1
и связанные ярлыки.[9] - ^ Также указано для
ISO-8859-9
и связанные ярлыки.[9] - ^ Указывается 0xA3A0 как дублирующая кодировка идеографическое пространство (U + 3000) по соображениям совместимости и, как таковой, исключая U + Eve5 (персонаж для личного пользования).[10][11] Кроме того, указанное с помощью 0x80 принимается в качестве альтернативной кодировки знак евро (U + 20AC; см. Окна-936).[12] В противном случае следует сопоставлениям из стандарта 2005 года.[11]
- ^ Набор дополнительных символов Гонконга вариант, хотя большинство расширений HKSCS (с ведущими байтами меньше 0xA1) не включаются кодером, а только декодером.[13]
- ^ В спецификацию входят IBM и NEC расширения (см. Окна-31J).[14]
- ^ В спецификации используется тот же индекс, что и для Shift JIS (насколько это возможно), то есть включает расширения NEC. Кана половинной ширины преобразуется кодировщиком в полную ширину,[15] но принимается декодером с использованием escape-последовательности (ESC 0x28 0x49).[16] Сдвиг и Перейти в (0x0E и 0x0F) полностью исключены для предотвращения атак.[16][17]
- ^ Фактически Единый код хангыль, который представляет собой надмножество, охватывающее все Слоги хангыль блокировать.[18]
- ^ Предназначен только для декодирования; отправка форм из документов в кодировке UTF-16 должна быть закодирована в UTF-8.[19]
- ^ Для совместимости с развернутым контентом, также указано для простого
UTF-16
метка,[20] хотя Знак порядка байтов, если присутствует, имеет приоритет над любой меткой.[21] Предназначен только для декодирования; отправка форм из документов в кодировке UTF-16 должна быть закодирована в UTF-8.[19] - ^ Преобразует 0x00 через 0x7F в U + 0000 через U + 007F и с 0x80 через 0xFF на U + F780 через U + F7FF (a Зона частного использования range), так что младшие 8 бит кодовой точки всегда соответствуют исходному байту.[22]
Следующие дополнительные кодировки перечислены в Стандарте кодирования, и поэтому также требуется их поддержка:[9]
- ^ Использует тот же кодировщик и декодер, что и ISO-8859-8, но не подчиняется поведению визуального порядка, которое используется для документов, помеченных как ISO-8859-8.[23]
- ^ Также указано для
GB2312
и связанные ярлыки. Для декодирования обрабатывается так же, как GB18030.[24] Для целей кодирования маркировка как GBK (или GB2312) исключает четырехбайтовые коды и отдает предпочтение однобайтовому представлению 0x80 для U + 20AC.[10] - ^ В спецификации используется тот же индекс, что и для 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.
Смотрите также
- Обнюхивание кодировки - используется многими браузерами, когда метаданные кодировки символов недоступны
- Юникод и HTML
- Код языка
- Список ссылок на символьные сущности XML и HTML
Рекомендации
- ^ "Тип содержимого", Протокол передачи гипертекста (HTTP / 1.1): семантика и содержание, IETF, Июнь 2014 г., получено 30 июля 2014
- ^ Модуль Apache mod_charset_lite
- ^ а б c «Указание кодировки символов документа», HTML5, Консорциум World Wide Web, 14 декабря 2017, получено 28 мая 2018
- ^ Брей, Т.; Paoli, J .; Сперберг-Маккуин, К.; Maler, E .; Йерго, Ф. (26 ноября 2008 г.), «Объявление типа пролога и документа», XML, W3C, получено 8 марта 2010
- ^ HTML5 предварительно сканирует поток байтов, чтобы определить его кодировку
- ^ «8.2.2.3. Кодировки символов». HTML 5.1 Стандартный. W3C.
- ^ «8.2.2.3. Кодировки символов». HTML 5 Стандартный. W3C.
- ^ а б c «12.2.3.3 Кодировки символов». Уровень жизни HTML. WHATWG.
- ^ а б c d е ван Кестерен, Энн. «4.2: Имена и ярлыки». Стандарт кодирования. WHATWG.
- ^ а б ван Кестерен, Энн. "10.2.2. Энкодер gb18030". Стандарт кодирования. WHATWG.
- ^ а б ван Кестерен, Энн. "5. Указатели (§ индекс gb18030)". Стандарт кодирования. WHATWG.
- ^ ван Кестерен, Энн. "10.2.1. Gb18030 декодер". Стандарт кодирования. WHATWG.
- ^ ван Кестерен, Энн. "5. Индексы (§ указатель Big5 index)". Стандарт кодирования. WHATWG.
- ^ ван Кестерен, Энн. "5. Указатели (§ Указатель jis0208)". Стандарт кодирования. WHATWG.
- ^ ван Кестерен, Энн. «5. Указатели (§ Указатель ISO-2022-JP katakana)». Стандарт кодирования. WHATWG.
- ^ а б ван Кестерен, Энн. «12.2.1. Декодер ISO-2022-JP». Стандарт кодирования. WHATWG.
- ^ ван Кестерен, Энн. «12.2.2. Кодировщик ISO-2022-JP». Стандарт кодирования. WHATWG.
- ^ ван Кестерен, Энн. «5. Индексы (§ индекс EUC-KR)». Стандарт кодирования. WHATWG.
- ^ а б ван Кестерен, Энн. «4.3. Выходные кодировки». Стандарт кодирования. WHATWG.
- ^ ван Кестерен, Энн. «14.4. UTF-16LE». Стандарт кодирования. WHATWG.
- ^ ван Кестерен, Энн. «6. Крючки для стандартов (§ декодирование)». Стандарт кодирования. WHATWG.
- ^ ван Кестерен, Энн. "14.5. X-определяемый пользователем". Стандарт кодирования. WHATWG.
- ^ ван Кестерен, Энн. «9. Устаревшие однобайтовые кодировки (§ Примечание)». Стандарт кодирования. WHATWG.
- ^ ван Кестерен, Энн. «10.1. ГБК». Стандарт кодирования. WHATWG.
- ^ ван Кестерен, Энн. "5. Указатели (§ Указатель jis0212)". Стандарт кодирования. WHATWG.
- ^ ван Кестерен, Энн. «14.1: замена». Стандарт кодирования. WHATWG.
- ^ ван Кестерен, Энн. «2: Фон безопасности». Стандарт кодирования. WHATWG.
- ^ ван Кестерен, Энн. «4.2: Имена и ярлыки (§ замена)». Стандарт кодирования. WHATWG.
- ^ Брей, Т.; Paoli, J .; Сперберг-Маккуин, К.; Maler, E .; Йерго, Ф. (26 ноября 2008 г.), «Ссылки на персонажей и сущностей», XML, W3C, получено 8 марта 2010
внешняя ссылка
- Инструмент кодирования и декодирования HTML-сущностей онлайн
- Ссылки на символьные сущности в HTML4
- Полное руководство по кодированию веб-символов
- Глава HTML Entity Encoding в Руководстве по безопасности браузера - дополнительная информация о текущих браузерах и работе с ними
- Вики-статья проекта Open Web Application Security Project о межсайтовых сценариях (XSS)