Ускоряющая клавиша n предназначена для пропусков при навигации по страницам. Пропуск для перехода на начало контента.

Данный документ является переводом. В случае каких-либо несоответствий и ошибок последняя версия документа на английском языке должна рассматриваться в качестве официальной. Первоначальное авторское право принадлежит W3C, как то указано ниже.

Переводчик: Alexandr, Art life

s_gotoW3cHome Internationalization
 

Назначение кодировки символов в HTML

Предполагаемая аудитория: шифровальщики XHTML / HTML (используя редакторы или скрипты), разработчики скриптов (PHP, JSP, и т.д.), шифровальщики CSS, Менеджеры веб-проектов, и каждый, кто хочет узнать как назначить кодировку символов их (X) HTML или CSS файла.

Примечание: Так как этот документ был переведен, изменения были внесены в написанный английским языком оригинал. Смотрите журнал изменений.

Вопрос

Как назначить кодировку моего HTML файла?

Вводная информация

Вы должны всегда указывать кодировку, которая используется для HTML или XML страницы. Если вы этого не сделаете, вы рискуете, что символы в контенте будут неправильно интерпретированы. Это не просто вопрос читабельности текста человеком, больше - машины также должны понимать ваши данные. Вы должны также проверить, не указали ли вы различные кодировки в разных местах.

Данная статья предлагает простые советы о том, как создать необходимые назначения. Это делается двумя способами:

  1. она дает простой совет для тех, кто просто хочет указание на то, что делать
  2. она обеспечивает дополнительную информацию для тех, кто хочет понять тему лучше или изучить альтернативные подходы. Она предполагает, что в первую очередь вы читали быстрый ответ.

Если вы хотите лучше понять какие есть символы и кодировки символов, смотрите статью Кодировка символов для начинающих. Сведения о назначении кодировок в таблицах стилей CSS, смотрите Назначение кодировок символов в CSS.

Быстрый ответ

Здесь мы приведем краткую информацию с минимальными пояснениями для тех, кто просто хочет указание на то, что делать. Выполните следующие действия:

  1. Решите, следует ли использовать Заголовок HTTP
  2. Проверьте формат, который вы используете по таблице назначения внутри документа.
  3. Прочитайте о названиях кодировок символов

Если вы не понимаете эти советы или хотите понять обоснования, то ссылки приведут вас к разделам внизу страницы, которие обеспечивают примеры и разъяснения.

Заголовки HTTP

Вы определенно должны использовать назначения Заголовка HTTP если есть вероятность того, что документ будет транскодуватися (т.е. кодирование будет изменено серверами посредниками), так как HTTP назначения имеют более высокий приоритет, чем назначение в документе.

В противном случае вы должны использовать HTTP заголовки если это имеет смысл для любого типа контента, но в сочетании с назначениями в документе (смотрите ниже). Вы всегда должны проверять, чтобы HTTP назначения отвечали назначениям в документе.

Если ваша страница закодирована в UTF-16, не делайте такие назначения, чтобы ваш файл был "UTF-16BE" или "UTF-16LE", используйте только "UTF-16" , и отправляйте byte-order mark (маркер порядка байтов) с вашим файлом.

Назначение внутри документа

В каждом из приведенных ниже примеров, если не указано иное, вставляйте соответствующее название кодировки там, где вы видите "UTF-8".

Формат Что делать
HTML5

Используйте атрибут meta charset в мэта элементе в верхней части в элементе head, и убедитесь, чтобы все назначения вписываются в первые 1024 байт этой страницы.

<meta charset="UTF-8">

HTML5 с UTF-16

Убедитесь, что есть byte-order mark (маркер порядка байтов) в начале файла.

Рабочая Группа HTML в настоящее время обсуждает, можно ли использовать назначения мэта элемента в элементе head при использовании кодировки UTF-16. Пока нельзя.

HTML4

Используйте директиву pragma в верхней части элемента head.

<meta http-equiv="Content-type" content="text/html;charset=UTF-8">
XHTML 1.x подается с текстовым/html MIME типом

Используйте UTF-8 для кодирования вашей страницы, и используйте директиву pragma в верхней части элемента head.

<meta http-equiv="Content-type" content="text/html;charset=UTF-8" />

(Если вы хотите использовать любую другую кодировку для вашего контента, то ниже читайте подробную информацию.)

XHTML 1.x представляется как XML

Используйте назначение кодирования и назначение XML на первой строке страницы. Убедитесь, что перед ним ничего нет, включая пробелы (несмотря на то, что с byte-order mark (маркером порядка байтов) все в порядке).

<?xml version="1.0" encoding="UTF-8"?>

Названия кодировок символов

Вы можете найти названия кодировок символов в реестре IANA. Вы должны использовать эти названия для каждого метода указания кодировки символов, которые перечислены здесь. Заметим, что хотя согласно IANA они и называются charset названиями, но в действительности они относятся к кодировкам, а не к наборам символов.

Реестр IANA обычно включает в себя несколько названий для одного и того же кодирования. В этом случае вы должны использовать название обозначенное как 'лучшее'.

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

Обратите внимание, что есть дефис в названии UTF-8.

Альтернативные подходы

Есть различные альтернативы для подходов, предложенных выше, но они обычно имеют плюсы и минусы. Пройдите по следующих ссылках для более подробной информации.

Подробнее

Здесь мы предоставим более подробную информацию о различных возможных способах назначения информации о кодировке символов, начиная с заголовков HTTP, а затем перечисляем различные внутри-документальные подходы для страниц, которые закодированы не в UTF-16. Существует специальный подраздел для страниц закодированных в UTF-16.

В этом разделе:

Заголовок HTTP

Content-Type іинформация в HTTP заголовке может включать информацию о кодировке символов документа.

HTTP/1.1 200 OK
Date: Wed, 05 Nov 2003 10:46:04 GMT
Server: Apache/1.3.28 (Unix) PHP/4.2.3
...
Content-Type: text/html; charset=UTF-8
Content-Language: en

Кодирование может быть указано в HTTP заголовке для файлов, содержащих такие вещи, как CSS и JavaScript, а не только HTML разметку.

Если документ создается динамически с помощью скриптов, вы сможете добавить эту информацию в HTTP заголовке. Например, в PHP использовать функцию header() перед созданием любого контента, например:

<?php header('Content-type: text/html; charset=utf-8'); ?>
<!DOCTYPE html>
...

Если вы обслуживаете статические файлы, сервер может ассоциировать эту информацию с файлами. Способ настройки сервера для передачи информации о кодировке символов таким образом, будет варьироваться от сервера к серверу. Поэтому вы должны узнать о нем у администратора сервера.

Как, пример, Apache серверы обычно предоставляют кодировку по умолчанию, которую обычно можно переопределить пользовательскими настройками. Например, пользователь может добавить следующую строку к .htaccess файлу для обслуживания всех файлов с расширением .html как UTF-8 в этой и всех дочерних директориях:

AddType 'text/html; charset=UTF-8' html

Для получения дополнительной информации об изменении кодировки в заголовке HTTP, смотрите Настройка HTTP charset параметра.

Давайте посмотрим на то, целесообразно ли назначать кодирование в заголовке HTTP, внутри страницы, либо и там, и там.

Преимущества

Недостатки

Так я должен использовать этот метод?

Никогда не будет проблемы с отправкой информации о кодировке символов документа в заголовке HTTP, пока эта информация верна, если обслуживать файлы через HTTP с сервера.

Если вы думаете, что есть шанс, что кодирование файла может быть изменено посредником прежде чем файл достигнет пользователя (например, транскодирования в кодировку, которую можно узнать на мобильном телефоне), может быть, вам хотелось бы рассмотреть вопрос об использовании назначения HTTP, поскольку именно здесь будут изменения.

С другой стороны, из-за недостатков, перечисленных выше, мы рекомендуем, чтобы вы всегда назначали информацию о кодировке внутри документа.

(Некоторые люди утверждают, что редко выделяется назначение кодирования в заголовке HTTP, если вы собираетесь повторить его в контенте документа. В этом случае, они предлагают, что заголовок HTTP ничего не говорит о кодировке документа. Заметим, что это, как правило, означает принятия мер по отключению любых настроек сервера по умолчанию.)

Мэта атрибут charset

Cпецификации HTML5 описывает новый способ назначения кодировки документа, который уже поддерживается основными браузерами. Вы можете использовать это для страниц, написанные с помощью разметки HTML5. Кроме того, вы можете использовать директиву pragma, но вы не должны использовать то и другое на той же странице.

Если вы используете это назначение в HTML4 страницах, валидатор HTML4 будет жаловаться (хотя браузер может еще выявлять информацию).

Назначение выглядит следующим образом.

<meta charset="UTF-8">

Спецификация HTML5 требует, чтобы все мэта элементы находились в первых 1024 байтам документа, поэтому всегда включайте их в верхнюю часть элемента head.

Если вы использовали UTF-8, то вам не строго необходимо использовать точное назначение, но лучше это сделать, поскольку оно позволяет визуально осмотреть кодирования в исходном коде. Это также может дать более эффективную поддержку в старых браузерах и средствах разработки.

Если вы кодируете страницу в UTF-16, смотрите Использование UTF-16.

Директива pragma

Это мэта элемент, который должен находиться как можно ближе к верхней части элемента head, и который выглядит следующим образом:

<meta http-equiv="Content-type" content="text/html;charset=UTF-8">
Для синтаксиса XHTML после атрибута контента, вы должны, конечно, иметь " />" , а не просто ">".

Кодировку документа указывается только после charset=. В этом случае указанное кодирование - Unicode кодирование UTF-8.

Директива pragma должна быть использована для страниц, написанных в HTML 4.01. Она также должна быть использована для документов XHTML 1.x, которые подаются как HTML, так как анализатор HTML не будет собирать информацию о кодировке с XML назначения.

В HTML5 вы можете использовать этот подход для назначения кодирования, и для вновь указанного мэта атрибута charset, но не используйте то и другое на той же странице. Назначение кодирования должно также вписываться в первые 1024 байт документа, таким образом вы должны разместить его сразу же после открывающего тега элемента head.

Кодирование внутри документа позволяет правильно читать документ, находящийся не на сервере. Это относится не только к статическим документам, что читаются с диска или CD, но и к динамическим документам, которые сохранены читателем.

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

Если вы кодируете страницу в UTF-16, смотрите Использование UTF-16.

Назначение XML

Назначение XML определяется XML стандартом. Оно появляется в верхней части XML файла и поддерживает назначение кодирования. Например:

<?xml version="1.0" encoding="UTF-8"?>

Назначение XML нужно для документа, который анализируется как XML, если кодировка документа, отличается от UTF-8 или UTF-16 и, если кодировка не предоставлена протоколом высшего уровня, например заголовком HTTP.

Это важно потому, что если вы решите пропустить назначения XML, то вы должны выбрать или UTF-8 или UTF-16 в качестве кодировки для страницы, если она должна использоваться без HTTP!

Вы должны использовать назначения XML для указания кодировки любого документа XHTML 1.x, что подается как XML.

Это может быть полезно использовать назначение XML для веб-страниц, представляемых как XML, даже если кодировка UTF-8 или UTF-16, поскольку такое назначение внутри документа также помогает разработчикам, тестерам, или менеджерам по переводу и производству установить кодировку файла с помощью визуальной проверки исходного кода.

Использование назначения XML для XHTML, что подается как HTML. Если XHTML подается как HTML, то и анализируется как HTML, даже если она основана на синтаксисе XML и, следовательно, назначение XML не должно распознаваться браузером. Именно поэтому, чтобы указать кодировку при подаче XHTML таким образом *, вы должны использовать директиву pragma.

* И наоборот, директива pragma, не признается анализаторами XML как назначение кодирования.

С другой стороны, файл также может быть использован в какой-то момент в качестве вклада в другие процессы, которые используют анализаторы XML. Это включает в себя такие вещи, как XML редакторы, XSLT преобразования, AJAX и т.д. Кроме того, иногда люди используют серверную логику для определения того, подавать ли файл как HTML или XML. По этим причинам, если вы не используете UTF-8 или UTF-16, то вы должны добавить назначение XML в начале разметки, даже если она подается в браузер, как HTML. Это сделает начало файла похожим на:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http‎://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-type" content="text/html;charset=ISO-8859-1" />
...

Если вы используете UTF-8 или UTF-16, то нет никакой необходимости для назначения XML, особенно как мэта элемент, снабженный для визуального осмотра кодирования людьми, которые обрабатывают файл.

Обслуживание старых браузеров. В Internet Explorer 6 если что-то появляется перед назначением DOCTYPE, то страница отображается в режиме совместимости. Если вы используете UTF-8 или UTF-16, то вы можете упустить назначения XML, и у вас не будет проблем.

Однако может возникнуть проблема, если вы не используете эти кодировки и пользователи Internet Explorer 6 составляют значительную долю ваших читателей, и если ваш документ содержит конструкции, на которые влияет разница между стандартным режимом по сравнению с режимом совместимости. Если вы хотите чтобы убедиться, что ваши страницы отображаются так же, на всех отвечающих стандартам браузерах, вам придется добавить обходные пути к вашей CSS для преодоления разногласий.

Там могут быть и другие проблемы связанные с назначением XML, однако, вероятно, эти проблемы относятся к гораздо старшым браузерам. Спецификация XHTML предупреждает, что инструкции по обработке предоставляются на некоторых клиентских приложениях. Кроме того, некоторые клиентские приложения интерпретируют назначение XML имея в виду, что документ является неузнанным XML, а не HTML, и поэтому не может выполнить документ как это ожидается. Вы должны протестовать соответствующие клиентские приложения, чтобы решить будет ли это проблемой для вас.

Конечно, как уже упоминалось выше, если вы используете UTF-8 или UTF-16, то назначение XML можно упустить и файл по-прежнему будет работать, как XML или HTML. Вероятно, это самое простое решение.

Использование UTF-16

Согласно результатам выборки Google в несколько миллиардов страниц в 2010 году, менее 0,01% страниц в Интернете закодовни в UTF-16. В большинстве случаев вам, вероятно, лучше выбрать UTF-8 в качестве кодировки (на которую в том же исследовании приходилось более 50% всех веб-страниц). Одна из причин этого - то, что существуют специальные правила для назначения кодировки UTF-16 для страницы.

В этой статье мы рекомендуем назначать кодирование внутри документа, даже если вы также назначили его в заголовке HTTP. Однако, HTML5 спецификация в настоящее время запрещает использование мэта атрибута charset или директивы pragma для назначения UTF-16. Существует некоторая дискуссия вокруг того, что необходимо, и все может измениться. Однако, в настоящее время, если вы хотите проверить ваш код HTML5, то вы не должны использовать назначение элемента для контента закодированного в UTF-16.

Или вы используете назначения основаные на элементе или нет, вы должны убедиться, что у вас всегда есть byte-order mark (маркер порядка байтов) в самом начале файла закодированного в UTF-16. По сути, это - назначение внутри документа.

Кроме того, если ваша страница закодирована как UTF-16, то не провозглашайте ваш файл, как "UTF-16BE" или "UTF-16LE", используйте только "UTF-16". byte-order mark в начале файла будет указывать, что схема кодирования - little-endian или big-endian. (Это происходит потому, что контент явно закодирован, как, скажем, UTF-16BE не должен использовать byte-order mark, но HTML5 требует byte-order mark для страниц закодированных в UTF-16.)

Атрибут charset в ссылке

Спецификация HTML 4.01 описывает атрибут charset который может быть добавлен к таким элементам: a, ссылка и скрипт и должен указать кодировку документа на который вы ссылаетесь.

Это может быть использовано в таком элементе, как встроенная ссылка следующим образом:

See our <a href="/mysite/mydoc.html" charset="ISO-8859-1">list of publications</a>.

Вы можете также использовать его, чтобы указать кодировку таблицы стилей CSS:

<link rel="stylesheet" charset="Windows-1251" href="mystyles.css" type="text/css">

Идея в том, что браузер сможет применить правильную кодировку для документа, который он извлекает, если кодировка документа не указана в любой другой форме.

По спецификации HTML5 использование этого атрибута для таких элементов как: a или ссылка в настоящее время устарело, поэтому следует избегать его использования для этих элементов.

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

Этот способ указания кодировки документа имеет низкий приоритет (то есть если кодировка назначена любым другим способом, то это будет игнорироваться). Это означает, что вы не можете использовать его, чтобы исправить любые неправильные назначения.

Правила приоритета

В случае конфликта между несколькими назначениями кодирования, правила приоритета применяются для определения назначения, которое будет главным. Для XHTML и HTML, приоритет определяется из списка, где 1 это самый высокий.

  1. Content-Type заголовок HTTP
  2. byte-order mark (BOM)
  3. назначение XML
  4. мэта элемент
  5. атрибут charset в ссылке

Как уже упоминалось ранее, высокий приоритет заголовка HTTP является полезным в ситуациях, когда кодировка документа изменяется сервером посредником, так как такие "транскодирования" вряд ли изменят назначения внутри документа. Однако, сервер транскодирования должен назначить новое кодирование в заголовке HTTP.

Спецификация HTML5 (еще нестабильна) формально описывает приоритет для byte-order mark (BOM). Согласно спецификации, BOM имеет более низкий приоритет, чем Content-Type заголовок HTTP, но более высокий приоритет, чем все остальное. На момент написания, это не всегда выполнялось в последних версиях основных браузеров. Для получения дополнительной информации смотрите результаты теста.

Выскажите своё мнение (по-английски).

Подпишитесь на ленту новостей RSS.

Новые публикации

Новости главной страницы

Twitter (Новости главной страницы)

‎@webi18n

Дополнительные материалы

Автор: Richard Ishida, W3C. Переводчик: Alexandr, Art life.

Допустимый XHTML 1.0!
Допустимый CSS!
Кодировка UTF-8!

Перевод с английского: 2010-09-09. Последнее внесение изменений в перевод: 2011-08-17 14:52 GMT

Для просмотра истории внесения изменений нажмите qa-html-encoding-declarations в блоге i18n.