UTF-8 — кодування символів

Юнікод підтримує практично всі існуючі набори символів. Найкращою формою кодування набору символів Юнікоду є UTF-8-кодування. У ній реалізована сумісність з ASCII, стійкість до спотворення даних, ефективність і простота обробки. Але про все по порядку.

Форми кодування

Комп’ютери оперують числами не просто як абстрактними математичними об’єктами, а як комбінаціями одиниць зберігання і обробки інформації фіксованого розміру – байтів і 32-розрядних слів. Стандарт кодування повинен це враховувати при визначенні способу представлення символів числами.

В комп’ютерних системах цілі числа зберігаються в комірках пам’яті розміром 8 біт (1 байт), 16 або 32 біт. Кожна форма кодування Unicode визначає, яка послідовність комірок пам’яті представляє ціле число, відповідне конкретному символу. У стандарті представлено три різні форми кодування символів Юнікоду: 8, 16 і 32-бітними блоками. Відповідно, вони носять назву UTF-8, UTF-16 і UTF-32. Назва UTF розшифровується як формат перетворення Юнікод. Кожна з трьох форм кодування є рівноправним засобом представлення символів Юнікод, має переваги в різних областях застосування.

Дані кодування можуть бути використані для представлення всіх символів стандарту Юнікод. Таким чином, вони повністю сумісні для рішень, з різних причин використовують різні форми кодування. Кожна кодування може бути однозначно перетворена в будь-яку з двох інших без втрати даних.

Принцип неналожения

Кожна з форм кодування Юнікоду розроблена з урахуванням неприпустимості часткового накладання. Наприклад, Windows-932 формує символи з одного або двох байтів коду. Довжина послідовності залежить від першого байта, тому значення лідируючого байта в послідовності з двох байтів і одиночного байта не перетинаються. Однак значення одиночного байта і останнього байта послідовності можуть збігатися. Це означає, наприклад, що при пошуку символу D (код 44) можна помилково знайти його входять у другу частину послідовності з двох байтів символу «Д» (код 84 44). Щоб з’ясувати, яка послідовність є правильною, програма має врахувати попередні байти.

Ситуація ускладниться, якщо ведучий і замикає байт співпадуть. Це означає, що для зняття неоднозначності буде проводитися зворотний пошук до досягнення початку тексту або однозначної послідовності коду. Це не тільки неефективно, але не захищене від можливих помилок, адже достатньо одного неправильного байта, щоб весь текст нечитабельним.

Формат Unicode перетворення дозволяє уникнути цієї проблеми, тому що значення ведучої, що замикає і одиночної одиниці зберігання інформації не збігаються. Завдяки цьому всі кодування Юнікоду підходять для пошуку і порівняння, ніколи не даючи помилкового результату із-за збігу різних частин коду символів. Той факт, що дані форми кодування дотримуються принцип неналожения, відрізняє їх від інших многобайтовых східноазіатських кодувань.

Іншим аспектом непересечения кодування Юнікоду є те, що кожен символ має чітко визначені межі. При цьому відпадає необхідність у скануванні невизначеного числа попередніх символів. Дану особливість кодувань іноді називають самосинхронизацией. Спотворення однієї одиниці коду введе до спотворення тільки одного символу, а навколишні символи залишаються недоторканими. В 8-бітному форматі перетворення, якщо покажчик посилається на байт, що починається з 10xxxxxx (у двійковому кодуванні), для пошуку початку символу потрібно від одного до трьох зворотних переходів.

Узгодженість

Консорціум Unicode в повній мірі підтримує всі 3 форми кодувань. Важливо не протиставляти UTF-8 і Юнікод, адже всі формати перетворення – однаково правомірні втілення форм кодування символів стандарту Юнікод.

Байт-орієнтація

Для представлення символу UTF-32 знадобиться одна 32-бітна одиниця коду, яка збігається з кодом Unicode. UTF-16 – від однієї до двох 16-бітних одиниць. А UTF-8 використовує до 4 байт.

Кодування UTF-8 створена для сумісності з байт-орієнтованими системами на основі ASCII. Велика частина існуючого програмного забезпечення і практика інформаційних технологій тривалий час спиралися на уявлення символів у вигляді послідовності байтів. Безліч протоколів залежить від незмінності кодування ASCII і використовує або уникає спеціальні керуючі символи. Простим способом адаптувати Юнікод до таких ситуацій можна, застосувавши 8-бітне кодування для представлення символів Юнікоду, еквівалентних будь-якому символу ASCII або керуючого символу. Для цього і призначена кодування UTF-8.

Змінна довжина

UTF-8 – кодування змінної довжини, що складається з 8-бітних одиниць зберігання інформації, старші біти яких позначають, до якої частини послідовності відноситься кожен окремий байт. Один діапазон значень відведено для першого елемента послідовності коду, інший – для наступних. Це забезпечує непересекаемость кодування.

ASCII

UTF-8-кодування повністю підтримує коди ASCII (0x00-0x7F). Це означає, що символи Юнікоду U+0000-U+007F конвертуються в єдиний байт 0x00-0x7F UTF-8 і таким чином стають не відрізнятись від ASCII. Більше того, щоб уникнути багатозначності, значення 0x00-0x7F не використовуються більше ні в одному байті представлення символів Юнікоду. Для кодування неидеографических символів, відмінних від ASCII, використовується послідовність з двох байтів. Символи діапазону U+0800-U+FFFF представлені трьома байтами, а додаткові з кодами більше U+FFFF вимагають чотирьох байтів.

Область застосування

Кодуванні UTF-8 зазвичай віддається перевага в протоколі HTML і йому подібним.

XML став першим стандартом з повною підтримкою кодування UTF-8. Організації, що займаються стандартизацією, теж рекомендують. Проблема підтримки в адресах URL, відмінних від ASCII-символів, була вирішена, коли консорціум W3С та інженерна група IETF прийшли до угоди про кодування всіх адрес URL виключно в UTF-8.

Сумісність з ASCII полегшує перехід до нового програмного забезпечення. З UTF-8 працює більшість текстових редакторів, у тому числі JEdit, Emacs, BBEdit, Eclipse і «Блокнот» операційної системи Windows. Жодна інша форма кодування Юнікоду не може похвалитися такою підтримкою з боку інструментальних засобів.

Перевага кодування полягає в тому, що вона складається з послідовності байтів. З рядками UTF-8 легко працювати в C і інших мовах програмування. Це єдина форма кодування, що не вимагає мітки порядку байтів BOM або оголошення кодування XML.

Самосинхронизация

В оточенні, що використовує 8-бітну обробку символів, порівняно з іншими многобайтными кодуваннями, UTF-8 володіє наступними перевагами:

  • Перший байт послідовності коду містить інформацію про його довжині. Це підвищує ефективність прямого пошуку.
  • Спрощено знаходження початку символу, так як початковий байт обмежений фіксованим діапазоном значень.
  • Відсутній перетин значень байтів.

Порівняння переваг

UTF-8-кодування компактна. Але при застосуванні для кодування східноазіатських символів (китайських, японських, корейських, використовують знаки китайського письма) використовуються 3-байтные послідовності. Також UTF-8-кодування поступається іншим формам кодування по швидкості обробки. А двійкова сортування рядків дає той же результат, що і двійкова сортування Юнікоду.

Схема кодування символів

Схема кодування символів складається з форми кодування символів і способу побайтного розташування одиниць коду. Для визначення схеми стандартом кодування Юнікоду передбачено використання початкової мітки порядку байтів (BOM, Byte order mark).

При включенні BOM в UTF-8 функція мітки обмежується лише вказівкою на використання форми кодування. Проблеми визначення порядку байтів у UTF-8 немає, так як її розмір одиниці кодування дорівнює одному байту. Використання BOM для даної форми кодування не є ні обов’язковим, ні рекомендованим. BOM може зустрічатися в текстах, конвертованих з інших кодувань, використовують мітку порядку байтів, або сигнатури для кодування UTF-8. Являє собою послідовність з 3 байтів EF16 BB16 BF16.

Як задати кодування UTF-8

В HTML кодування UTF-8 встановлюється з допомогою наступного коду:

head

meta http-equiv=»Content-Type» content=»text/html; charset=utf-8″

В PHP кодування UTF-8 задається за допомогою функції header() на самому початку файлу після встановлення значення рівня виводу помилок:

?php

error_reporting(-1);

header(‘Content-Type: text/html; charset=utf-8’);

Для підключення до баз даних MySQL кодування UTF-8 встановлюється так:

?php

mysql_set_charset(‘utf8’);

В CSS-файли кодування UTF-8 зазначається так:

@charset «utf-8»;

При збереженні файлів всіх типів вибирається кодування UTF-8 без BOM, інакше сайт працювати не буде. Для цього в програмі DreamWeave потрібно вибрати пункт меню «Модифікації – Властивості сторінки – Заголовок/Кодування», змінити кодування на UTF-8. Потім слід перезавантажити сторінку, прибрати галочку з пункту «Підключити Юнікод сигнатури (BOM)» і застосувати зміни. Якщо який-небудь текст на сторінці або в базі даних був введений іншою формою кодування, то його потрібно ввести заново або перекодувати. При роботі з регулярними виразами обов’язково використовувати модифікатор u.

Також можна зберегти файл у кодуванні UTF-8 в «Блокноті» ОС Windows. Після вибору пункту меню «Файл – Зберегти як…» встановити необхідну форму кодування і зберегти файл у кодуванні UTF-8.

В текстовому редакторі Notepad++, якщо кодування відмінна від UTF-8, через пункт меню «Перетворити в UTF-8 без BOM» змінити кодування і зберегти в кодуванні UTF-8.

Альтернативи немає

В умовах глобалізації, коли політичні та мовні кордони стираються, набори символів, які мають місцеві особливості, стають малопридатними. Юнікод є єдиним набором символів з підтримкою всіх локалізацій. А UTF-8 – приклад правильної реалізації Юнікоду, яка:

  • підтримує широкий діапазон інструментальних засобів, у тому числі сумісність з кодуванням ASCII;
  • володіє стійкістю до спотворення даних;
  • проста і ефективна при обробці;
  • не залежить від платформи.

З появою UTF-8 дискусії про те, яка форма кодування або набір символів краще, стали безглузді.

 

Related posts

 
 

Leave a Reply

Ваш e-mail не будет опубликован. Обязательные поля помечены *

http://poradumo.com.ua/264849-u-7/