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

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

Перекладач: Alexandr, Art life

s_gotoW3cHome Інтернаціоналізація
 

Призначення кодування символів в 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:55 GMT

Для перегляду історії внесення змін до перекладу натисність qa-html-encoding-declarations в блоге i18n.