Unicode та HTML
Вебсторінки, створені за допомогою мови розмітки гіпертексту (HTML), можуть містити багатомовний текст, представлений універсальним набором символів Unicode universal character set. Ключем до взаємозв'язку між Unicode і HTML є взаємозв'язок між «набором символів документа», який визначає набір символів, які можуть бути присутніми в документі HTML, і присвоює їм номери, та «зовнішнім кодуванням символів» або «кодировкою», що використовуються для кодувати даний документ як послідовність байтів.
HTML |
---|
|
У RFC 1866, початковому стандарті HTML 2.0, набір символів документа визначався як ISO-8859-1. Він був розширений до ISO 10646 (що в основному еквівалентно Unicode) RFC 2070. Він не відрізняється між документами різних мов або створюється на різних платформах. Зовнішнє кодування символів вибирає автор документа (або програмне забезпечення, яке автор використовує для створення документа) і визначає, яким чином байти використовуються для зберігання та / або передачі карти документа символам із набору символів документа. Символи, яких немає у вибраному зовнішньому кодуванні символів, можуть бути представлені посиланнями на сутності символів.
Взаємозв'язок між Unicode та HTML, як правило, є важкою темою для багатьох комп'ютерних професіоналів, авторів документів та веб-користувачів. Точне подання тексту на веб-сторінках з різних природних мов та систем письма ускладнюється деталями кодування символів, синтаксисом мови розмітки, шрифтом та різними рівнями підтримки веб-браузерів.
Символи документа HTML
Вебсторінки, як правило, є документами HTML або XHTML. Обидва типи документів складаються на фундаментальному рівні з символів, які є графемами та графемоподібними одиницями, незалежно від того, як вони проявляються в комп'ютерних системах зберігання даних та мережах.
Документ HTML — це послідовність символів Unicode. Більш конкретно, документи HTML 4.0 повинні складатися з символів у наборі символів документа HTML: репертуару символів, в якому кожному символу присвоюється унікальний, невід'ємний цілий код коду. Цей набір визначено в HTML 4.0 DTD, який також встановлює синтаксис (допустимі послідовності символів), який може створити дійсний документ HTML. Набір символів документа HTML для HTML 4.0 складається з більшості, але не всіх, символів, спільно визначених Unicode та ISO / IEC 10646: Універсальний набір символів (UCS).
Як і документи HTML, документ XHTML є послідовністю символів Unicode. Однак документ XHTML — це документ XML, який, не маючи явного рівня абстракції «символу документа», проте покладається на подібне визначення допустимих символів, яке охоплює більшість, але не всі, визначень символів Unicode / UCS. Набори, що використовуються HTML та XHTML / XML, дещо відрізняються, але ці відмінності мало впливають на пересічного автора документа.
Незалежно від того, є документ HTML або XHTML, при зберіганні у файловій системі або передачі через мережу символи документа кодуються як послідовність бітових октетів (байтів)відповідно до конкретного кодування символів. Це кодування може бути або форматом перетворення Unicode, наприклад UTF-8, який може безпосередньо кодувати будь-який символ Unicode, або старим кодуванням, наприклад Windows-1252, яке не може. Однак навіть при використанні кодування, яке підтримує не всі символи Unicode, у закодованому документі можуть використовуватися цифрові посилання на символи. Наприклад, & # x263A; (☺) використовується для позначення символу усміхненого обличчя в наборі символів Unicode.
Кодування символів
Для підтримки всіх символів Unicode, не вдаючись до цифрових посилань на символи, веб-сторінка повинна мати кодування, що охоплює весь Unicode. Найпопулярнішим є UTF-8, де символи ASCII, такі як англійські літери, цифри та деякі інші загальні символи, зберігаються незмінними щодо ASCII. Це робить HTML-код (наприклад,
та ) незмінним порівняно з ASCII. Символи поза діапазоном ASCII зберігаються у 2-4 байтах. Також можна використовувати UTF-16, де більшість символів зберігаються у вигляді двох байтів із різною ендіанністю, що підтримується сучасними браузерами, але рідше використовується.
Цифрові посилання на символи
Для того, щоб обійти обмеження застарілих кодувань, HTML розроблений таким чином, що можна представляти символи з цілого Unicode всередині документа HTML, використовуючи цифрові посилання на символи: послідовність символів, які чітко прописують кодову точку Unicode персонажа, якого представляють. Посилання на символ приймає вигляд & # N;, де N є або десятковим числом для кодової точки Юнікоду, або шістнадцятковим числом, і в цьому випадку воно має мати префікс x. Символи, що складають цифрові посилання на символи, універсально представлені в кожному кодуванні, дозволеному для використання в Інтернеті.
Наприклад, код коду Юнікоду, такий як U + 5408, який відповідає певному китайському ієрогліфу, повинен бути перетворений у десяткове число, перед яким стоїть & #, а потім -;, наприклад: & # 21512 ;, що створює це:合 (якщо це не схоже на китайський ієрогліф, див. Шаблон: Спеціальні символи). Підтримка шістнадцяткових значень у цьому контексті є недавніми, тому старші браузери можуть мати проблеми з відображенням символів, на які посилаються шістнадцяткові числа, але вони, мабуть, матимуть проблеми з відображенням символів Unicode над кодовою точкою 255. Щоб забезпечити кращу сумісність із старими браузерами, все ще поширеною практикою є перетворення шістнадцяткової кодової точки в десяткове значення (наприклад, & # 21512; замість & # x5408;).
Іменовані символьні сутності
У HTML 4 існує стандартний набір з 252 іменованих символьних сутностей для символів — деякі загальні, деякі неясні — які або не знайдені в певних кодуваннях символів, або чутливі до розмітки в деяких контекстах (наприклад, кутові дужки та лапки). Хоча на будь-який символ Unicode може посилатися його числовий код, деякі автори документів HTML воліють використовувати замість них ці іменовані сутності, де це можливо, оскільки вони менш загадкові та краще підтримуються ранніми браузерами.
Суб'єкти символів можуть бути включені в документ HTML за допомогою посилань на сутності, які приймають форму & EntityName ;, де EntityName — це ім'я сутності. Наприклад, & mdash ;, дуже схоже на & # 8212; або & # x2014 ;, представляє U + 2014: символ тире em «-», навіть якщо використовуване кодування символів не містить цього символу.
Визначення кодування символів
Для правильної обробки HTML веб-браузер повинен з'ясувати, які символи Unicode представлені закодованою формою документа HTML. Для цього веб-браузер повинен знати, яке кодування було використано.
Кодування інформації
Коли документ передається через повідомлення MIME або транспорт, що використовує типи вмісту MIME, такі як відповідь HTTP, повідомлення може сигналізувати про кодування за допомогою заголовка Content-Type, такого як Content-Type: text / html; charset = UTF-8. Інші зовнішні засоби декларування кодування дозволені, але рідко використовуються. Якщо в документі використовується кодування Unicode, інформація про кодування також може бути представлена у вигляді позначки байтового порядку. Нарешті, кодування можна оголосити за допомогою синтаксису HTML. Для серіалізації text / html тоді, доки сторінка кодується у розширенні ASCII (наприклад, UTF-8, і, отже, якщо сторінка використовує UTF-16), мета-елемент, наприклад <meta http- можна використовувати equiv = "content-type" content = "text / html; charset = UTF-8"> або (починаючи з HTML5) <meta charset = "UTF-8">. Для сторінок HTML, серіалізованих як XML, тоді варіанти декларування полягають у тому, щоб або покладатися на значення кодування за замовчуванням (яке для XML-документів UTF-8), або використовувати декларацію кодування XML. Мета-атрибут не відіграє жодної ролі в HTML, який використовується як XML.
Кодування за замовчуванням
Кодування за замовчуванням застосовується, коли немає зовнішнього чи внутрішнього оголошення кодування, а також немає позначки порядку байтів. Хоча за замовчуванням кодування для HTML-сторінок, що подаються як XML, повинно бути UTF-8, за замовчуванням кодування для звичайної веб-сторінки (тобто: для HTML-сторінок, що серіалізуються як text / html) залежить від локалізації браузера. Для системи, створеної переважно для західноєвропейських мов, це, як правило, Windows-1252. Для мов для кирилиці за замовчуванням зазвичай використовується Windows-1251. Для браузера з місця, де переважають застарілі багатобайтові кодування символів, можливо, буде застосована якась форма автоматичного виявлення.
Тенденції кодування
Через застарілі 8-бітові текстові подання в мовах програмуваннята операційних системах та бажання уникнути обтяження користувачів необхідністю розуміти нюанси кодування, багато текстових редакторів, що використовуються авторами HTML, не можуть або не хочуть пропонувати вибір кодування при збереженні файлів на диск і часто навіть не дозволяють вводити символи, що перевищують дуже обмежений діапазон. Отже, багато авторів HTML не підозрюють про проблеми з кодуванням і, можливо, не мають уявлення, яке кодування фактично використовують їх документи. Непорозуміння, такі як переконання, що декларація кодування впливає на зміну фактичного кодування (тоді як насправді це просто мітка, яка може бути неточною), також є причиною такого ставлення редактора. Ще одним фактором, що сприяє тому ж напрямку, є надходження UTF-8 — що значно зменшує потребу в інших кодуваннях, і, отже, сучасні редактори, як це рекомендовано специфікацією HTML5, за замовчуванням ставлять до UTF-8.
Позначка порядку байтів
Для обох серіалізацій HTML (тип вмісту «text / html» і вміст / тип «application / xhtml + xml») знак байтового порядку (BOM) є ефективним способом передачі інформації про кодування в документі HTML. Для UTF-8 специфікація не є обов'язковою, тоді як вона обов'язкова для кодування UTF-16 та UTF-32. (Примітка: UTF-16 та UTF-32 без специфікації офіційно відомі під різними назвами, вони відрізняються за кодуваннями, і тому потребують певної форми декларації кодування — див. UTF-16BE, UTF-16LE, UTF-32LE та UTF-32BE .) Використання символу специфікації (U + FEFF) означає, що кодування автоматично заявляє про себе для будь-якої програми обробки. Для обробки додатків потрібно лише шукати початкові 0x0000FEFF, 0xFEFF або 0xEFBBBF у байтовому потоці, щоб ідентифікувати документ як UTF-32, UTF-16 або UTF-8, кодований відповідно. Для цих кодувань не потрібні додаткові механізми метаданих, оскільки позначка порядку байтів включає всю інформацію, необхідну для обробки додатків. У більшості випадків символ позначки порядку байтів обробляється шляхом редагування програм окремо від інших символів, тому існує невеликий ризик того, що автор видалить або іншим чином змінить знак порядку байтів, щоб вказати на неправильне кодування (як це може статися, коли кодування оголошено в Англійська / латинська писемність). Якщо в документі відсутня позначка порядку байтів, той факт, що перший непустий символ для друку в документі HTML має бути «<» (U + 003C), може бути використаний для визначення UTF-8 / UTF-16 / Кодування UTF-32.
Перевизначення кодування
У багатьох документах HTML подається неточна інформація про кодування або взагалі відсутня інформація про кодування. Для того, щоб визначити кодування в таких випадках, багато браузери дозволяють користувачеві вручну вибрати ім'я кодування зі списку. Вони також можуть використовувати алгоритм автоматичного виявлення кодування, який працює узгоджено з або — у випадку специфікації та у випадку HTML, що служить як XML — проти ручного заміщення.
Для документів HTML, які мають серіалізований текст / html, ручне заміщення може застосовуватися до всіх документів або лише до тих, для яких кодування неможливо визначити, переглядаючи декларації та / або шаблони байтів. Той факт, що ручне заміщення присутнє і широко використовується, заважає прийняти точні декларації кодування в Інтернеті; тому проблема, ймовірно, зберігатиметься. Але зверніть увагу, що Internet Explorer, Chrome і Safari — як для XML, так і для текстових / html-серіалізацій — не дозволяють замінити кодування, коли сторінка містить специфікацію.
Для документів HTML, серіалізованих із бажаною міткою XML — application / xhtml + xml, перевизначення кодування вручну не дозволяється. Перевизначення кодування такого XML-документа означало б, що документ перестав бути XML, оскільки для XML-документів є фатальною помилкою наявність декларації кодування із виявленими помилками. В даний час браузери Gecko, такі як Firefox, дотримуються цього правила, тоді як більшість інших поширених браузерів, що підтримують HTML як XML, таких як браузери Webkit (Chrome / Safari), дозволяють замінити кодування документів XHTML вручну .
Підтримка веб-браузера
Багато браузерів здатні відображати лише невелику підмножину повного репертуару Unicode. Ось як ваш браузер відображає різні точки коду Unicode:
Unicode назва | Те, що показує браузер | ||
---|---|---|---|
U+0041 | A or A |
Латинська велика літера A | A |
U+00DF | ß or ß |
Латинська мала літера | ß |
U+0394 | Δ or Δ |
Грецька велика літера Дельта | Δ |
U+0419 | Й or Й |
Кириличний велика літера | Й |
U+0645 | م or م |
Арабська літера Меем | م |
U+3042 | あ or あ |
Хіраґанська літера А (японська) | あ |
U+53F6 | 叶 or 叶 |
Спрощені ієрогліфи «Leaf» (китайська) | 叶 |
U+1F602 | 😂 or 😂 |
Обличчя смайлика зі сльозами радості | 😂 |
U+1F602 | ᚠ or ᚠ |
Рунська літера Фе | ᚠ |
Деякі веб-браузери, такі як Mozilla Firefox, Opera, Safari та Internet Explorer (починаючи з версії 7), можуть відображати багатомовні веб-сторінки, розумно вибираючи шрифт для відображення кожного окремого символу на сторінці. Вони правильно відображатимуть будь-яку суміш блоків Unicode, якщо відповідні шрифти присутні в операційній системі.
Старі браузери, такі як Netscape Navigator 4.77 та Internet Explorer 6, можуть відображати лише текст, що підтримується поточним шрифтом, пов'язаним із кодуванням символів сторінки, і можуть неправильно тлумачити цифрові посилання на символи як посилання на значення коду в поточному кодуванні символів, а не ніж посилання на кодові точки Unicode. Коли ви використовуєте такий браузер, малоймовірно, що на вашому комп'ютері є всі ці шрифти, або що браузер може використовувати всі доступні шрифти на одній сторінці. Як результат, браузер не відображатиме текст у наведених вище прикладах правильно, хоча може відображати їх підмножину. Оскільки вони закодовані відповідно до стандарту, вони відображатимуться правильно в будь-якій системі, яка відповідає і має доступні символи. Крім того, ці символи, що мають імена для використання у посиланнях на іменовані сутності, швидше за все, будуть доступнішими за інші.
Для відображення символів поза багатомовна площина(Юнікод), таких як готична буква faihu, яка є варіантом рунічної букви fehu у таблиці вище, деякі системи (наприклад, Windows 2000) потребують ручного регулювання своїх налаштувань.