Кодування з міжнародного стандарту юнікод. Передумови створення і розвиток Юникода

Юнікод, або Унікод   (Англ. Unicode) - стандарт кодування символів, що дозволяє представити знаки практично всіх письмових мов.

Стандарт запропонований в 1991 році некомерційною організацією «Консорціум Юнікоду» (англ. Unicode Consortium), Яка об'єднує найбільші IT-корпораціі. Застосування цього стандарту дозволяє закодувати дуже велике число символів з різних писемностей: у документах   Unicode   можуть бути сусідами китайські ієрогліфи, математичні символи, букви грецького алфавіту, латиниці і кирилиці, при цьому стають непотрібними кодові сторінки.

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

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

Стандарт складається з двох основних розділів: універсальний набір символів ( UCS, Universal Character Set) І сімейство кодувань ( UTF, Unicode Transformation Format). Універсальний набір символів задає однозначну відповідність символів кодам - ​​елементам кодового простору, що представляє невід'ємні цілі числа. Сімейство кодувань визначає машинне представлення послідовності кодів UCS.

Процес перетворення з однієї форми в іншу називається нормуванням. Можливі 4 конверсії. Додатки вирішують, як нормалізувати рядки на основі їх використання. Важливо розуміти, що інтерпретація пучка байтів в пам'яті у вигляді рядка вимагає знання схеми його кодування. Неможливо точно визначити кодування для масиву байтів. Кодування байтів має бути відомо з деякий зовнішнє джерело, щоб правильно їх інтерпретувати.

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

Коди в стандарті Unicode розділені на кілька областей. Область з кодами від U + 0000 до U + 007F містить символи набору ASCIIз відповідними кодами. Далі розташовані області знаків різних писемностей, знаки пунктуації та технічні символи. Частина кодів зарезервована для використання в майбутньому. Під символи кирилиці виділені коди від   U + 0400 до U + 052F

Почнемо з наборів символів. Для того, щоб комп'ютери могли обробляти текст, вам потрібно зіставити графеми, кричущі речі, які ви пишете на папері, цифри. Таке відображення визначає набір символів і дає кожному номер і називається «набором символів». Символи не обов'язково повинні зіставлятися з графемами.

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

Передумови створення і розвиток Юникода

До кінця 1980-х років стандартом стали 8-бітові символи, при цьому існувало безліч різних 8-бітних кодувань і постійно з'являлися все нові. Це пояснювалося як постійним розширенням кола підтримуваних мов, так і прагненням створити систему кодування, частково сумісну з якої-небудь іншої (характерний приклад - поява альтернативної кодування для російської мови, обумовлене експлуатацією західних програм, створених для кодування CP437). В результаті з'явилася необхідність вирішення декількох завдань:

Хоча 16 біт було недостатньо для охоплення всіх персонажів в історії людства, досить 16 біт, якщо ви обмежуєте себе використання не мертвих сценаріїв. Таким чином, набір символів являє собою набір символів, кожен з яких має число. Але як його зберегти або відправити на інший комп'ютер? Крім того, не всі інше програмне забезпечення   може обробляти всі символи, які існують в Юникоде, але нам все одно потрібно поговорити з ними.

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

  • Проблема «крокозябра» (показу документів в неправильному кодуванні): її можна було вирішити або послідовним впровадженням методів вказівки використовуваного кодування, або впровадженням єдиної для всіх кодування.
  • Проблема обмеженості набору символів: її можна було вирішити або перемиканням шрифтів всередині документа, або впровадженням «широкої» кодування. Перемикання шрифтів здавна практикувалося в текстових процесорах, Причому часто використовувалися шрифти з нестандартною кодуванням, т. Н. « dingbat fonts»- в результаті при спробі перенести документ в іншу систему все нестандартні символи перетворювалося в крокозябри.
  • Проблема перетворення одного кодування в іншу: її можна було вирішити або складанням таблиць перекодування для кожної пари кодувань, або використанням проміжного перетворення в третю кодування, що включає всі символи всіх кодувань.
  • Проблема дублювання шрифтів: традиційно для кожного кодування робився свій шрифт, навіть якщо ці кодування частково (або повністю) збігалися по набору символів: цю проблему можна було вирішити, роблячи «великі» шрифти, з яких потім вибираються потрібні для даного кодування символи - однак це вимагає створення єдиного реєстру символів, щоб визначати, чому що відповідає.
  • Було визнано за необхідне створення єдиної «широкої» кодування. Кодування зі змінною довжиною символу, широко використовуються в Східній Азії, були визнані занадто складними у використанні, тому було вирішено використовувати символи фіксованої ширини. Використання 32-бітних символів здавалося занадто марнотратним, тому було вирішено використовувати 16-бітові.

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

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

    Таким чином, перша версія Юникода представляла собою кодування з фіксованим розміром символу в 16 біт, тобто загальне число кодів було 2 16 (65 536). Звідси походить практика позначення символів чотирма шестнадцатерічнимі цифрами (наприклад, U + 0410). При цьому в Юникоде планувалося кодувати не всі існуючі символи, а тільки ті, які необхідні в повсякденному побуті. Рідко використовувані символи повинні були розміщуватися в «області символів для приватного використання» ( Private Use Area), Яка спочатку займала коди U + D800 ... U + F8FF. Щоб використовувати Юнікод також і в якості проміжної ланки при перетворенні різних кодувань один в одного, в нього включили всі символи, представлені у всіх більш-менш відомих кодуваннях.

    Як починається наша історія - в темну і бушую ніч, звичайно, ми знаходимо нашого головного героя в задумі. Він запитує себе: «Що таке кодування?». Основні поняття прості. По-перше, ми починаємо з ідеї частині інформації - повідомлення - яке існує в поданні, зрозумілою людині. Наприклад, для англомовних доповідачів англійські слова, надруковані на сторінці або на екрані, вважаються звичайним текстом. Потім ми повинні мати можливість переводити повідомлення в вигляді простого тексту в інше уявлення, і нам потрібно мати можливість переводити закодований текст назад в звичайний текст.

    Надалі, проте, було прийнято рішення кодувати усе   символи і в зв'язку з цим значно розширити кодову область. Одночасно з цим, коди символів стали розглядатися не як 16-бітові значення, а як абстрактні числа, які в комп'ютері можуть представлятися безліччю різних способів.

    Оскільки в ряді комп'ютерних систем (наприклад, Windows NT) Вже були реалізовані 16-бітові символи, було вирішено все найбільш важливе кодувати тільки в межах перших 65 536 позицій (так звана англ. Basic Multilingual Plane, BMP). Інший простір використовується для «Додаткових символів» (англ. Supplementary Characters): Систем письма вимерлих мов або дуже рідко використовуваних китайських ієрогліфів, математичних і музичних символів.

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

    Для сумісності зі старими 16-бітними системами була винайдена система UTF-16, де перші 65 536 позицій відображаються безпосередньо як 16-бітові числа, а решта представляються у вигляді «сурогатних пар» (перший елемент пари з області U + D800 ... U + DBFF , другий елемент пари з області U + DC00 ... DFFF). Для сурогатних пар була використана частина кодового простору, раніше відведеного для «символів для приватного використання».

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

    Вимога про зворотне без втрат означає, що зіставлення між звичайним текстом і закодованим текстом має бути дуже щільним, дуже точним. І це підводить нас до другого питання. Для того, щоб зіставлення між звичайним текстом і закодованим текстом було дуже жорстким, а саме: щоб ми могли точно вказати, як працюють процеси кодування і декодування, ми повинні точно вказати, що таке простий текстове представлення виглядає.

    Оскільки в UTF-16 можна відобразити тільки 2 20 +2 16 (1 114 112) символів, то це і було обрано в якості остаточної величини кодового простору Юнікоду.

    Хоча кодова область Юникода була розширена за межі 2 16 вже у версії 2.0, перші символи в «верхній» області були розміщені тільки у версії 4.0.

    версії Юникода

    У міру зміни і поповнення таблиці символів системи Юникода і виходу нових версій цієї системи, - а ця робота ведеться постійно, оскільки спочатку система Юнікод включала тільки Plane 0   - двухбайтное коди, - виходять і нові документи ISO.   Система Юнікод існує в цілому в наступних версіях:

    Припустимо, наприклад, що звичайний текст виглядає так: 26 букв верхнього регістру англо-американського алфавіту плюс пробіл і три символи пунктуації: період, знак питання і тире. Це дає нам простий текстовий алфавіт з 30 символів. З іншого боку, ми можемо сказати, що наш простий текст виглядає так: 26 малих літер, 26 малих літер, 10 числових цифр, символ пробілу і десяток типів знаків пунктуації: період, кома, лапки, Ліва дужка, права дужка і т.д. це дає нам простий текстовий алфавіт з 75 символів.

    Як тільки ми точно визначимо, як виглядає текстове представлення повідомлення - кінцева послідовність символів з нашого 30-символьного алфавіту або, можливо, нашого 75-символьного алфавіту, - тоді ми зможемо розробити систему, яка може надійно кодувати і декодувати текстові повідомлення, написані на цьому алфавіті. Найпростіша така система - та, в якій кожен символ в алфавіті простого тексту має одне і тільки одне відповідне подання в закодованому тексті.

    • 1.1 (відповідає стандарту ISO / IEC 10646—1:1993),
    • 2.0, 2.1 (той же стандарт ISO / IEC 10646-1: 1993 плюс доповнення: « Amendments»З 1-го по 7-е і« Technical Corrigenda»1 і 2),
    • 3.0 (стандарт ISO / IEC 10646—1:2000).
    • 3.2 (стандарт 2002 роки)
    • 4.0 (стандарт 2003)
    • 4.01 (стандарт 2004)
    • 4.1 (стандарт 2005)
    • 5.0 (стандарт 2006)

    кодова простір

    Хоча форми запису   UTF-8   і UTF-32   дозволяють кодувати до 2 31 (2 147 483 648) кодових позицій, було прийнято рішення використовувати лише 2 20 +2 16 (1 114 112) для сумісності з UTF-16. Втім, навіть і цього більш ніж достатньо - сьогодні (у версії 5.0) використовується трохи більше 99 000 кодових позицій.

    Зрозуміло, в реальному світі на вибір символів для тексту у вигляді простого тексту впливають технологічні обмеження на кодований текст. Припустимо, у нас є кілька доступних технологій для зберігання закодованих повідомлень: одна технологія підтримує кодований алфавіт в 256 символів, інша технологія підтримує тільки 128 кодованих символів, а третя технологія підтримує тільки 64 кодованих символу. Природно, ми можемо зробити наш простий текстовий алфавіт набагато більше, якщо ми знаємо, що ми можемо використовувати технологію, яка підтримує більший алфавіт з кодованим текстом.

    Кодова простір розбито на 17 площин   по 2 16 (65536) символів. Нульова площина називається базової, В ній розташовані символи найбільш уживаних писемностей. Перша площина використовується, в основному, для історичних писемностей. Площині 16 і 17 виділені для приватного вживання.

    Для позначення символів Unicode   використовується запис виду « U + xxxx»(Для кодів 0 ... FFFF) або« U + xxxxx»(Для кодів 10000 ... FFFFF) або« U + xxxxxx»(Для кодів 100000 ... 10FFFF), де xxx   - шістнадцяткові цифри. Наприклад, символ «я» ( U + 044F) Має код 044F 16 = 1103 10.

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

    Кожен з цих методів має своє ім'я. Найголовніше в цих методах - деякі кодування з фіксованою шириною, а деякі - кодування змінної ширини. Навпаки, кодування зі змінною шириною розраховані на короткі, але розгортаються. Але він також має свого роду механізм «продовження в наступному байті», який дозволяє йому використовувати 2 байта або навіть 4 байта, якщо це необхідно.

    система кодування

    Універсальна система кодування (Юнікод) являє собою набір графічних символів і спосіб їх кодування для комп'ютерної обробки текстових даних.

    Графічні символи - це символи, які мають видиме зображення. Графічним символам протиставляються керуючі символи і символи форматування.

    Існує кілька методів кодування, і якщо ви хочете обмінюватися текстом з кимось, вам потрібно явно вказати, який метод кодування ви використовуєте. Навіщо кодувати щось в Юникоде? Ми починаємо з ідеї частині інформації - повідомлення - яке існує в поданні, зрозумілою людині.

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

    Графічні символи включають в себе наступні групи:

    • літери, що містяться хоча б в одному з обслуговуваних алфавітів;
    • цифри;
    • знаки пунктуації;
    • спеціальні знаки   (Математичні, технічні, ідеограми та ін.);
    • роздільники.

    Юнікод - це система для лінійного представлення тексту. Символи, що мають додаткові над- або підрядкові елементи, можуть бути представлені у вигляді побудованої за певними правилами послідовності кодів (складовою варіант, composite character) Або у вигляді єдиного символу (монолітний варіант, precomposed character).

    Але це зовсім інший предмет. Ця єдина рядок - ваша повна програма. Тут «Привіт, світ!» - це простий текст. Ви можете бачити це на екрані. Можливо, ви плануєте відправити файл другу. Ви повинні засунути його в холодний, безособовий зовнішній світ файлової системи.

    І там він буде існувати не як персонажі, а як прості 1 і 0, заворушення з кубиками і точками, заряджені і незаряджені частинки. Щоб написати рядок у файл, ви повинні закодувати її, використовуючи деяку систему кодування. Це те, що ви завжди робили. Але це було не завжди так очевидно.

    модифікуючі символи

    Графічні символи в Юникоде підрозділяються на протяжні і непротяжних (бесшірінние). Непротяжних символи при відображенні не займають місця в рядку. До них відносяться, зокрема, знаки наголосу і інші діакритичні знаки. Як протяжні, так і непротяжних символи мають власні коди. Протяжні символи інакше називаються базовими ( base characters), А непротяжних - модифікують (Combining characters); причому останні не можуть зустрічатися самостійно. Наприклад, символ «á» може бути представлений як послідовність базового символу «a» (U + 0061) і модифікує символу «?» (U + 0301) або як монолітний символ «á» (U + 00C1).

    Особливий тип модифікують символів - селектори варіантів накреслення ( variation selectors). Вони діють тільки на ті символи, для яких такі варіанти визначені. У версії 5.0 варіанти накреслення визначені для ряду математичних символів, для символів традиційного монгольського алфавіту і для символів листи Phags-Pa.

    форми нормалізації

    Оскільки одні й ті ж символи можна уявити різними кодами, Що іноді ускладнює обробку, існують процеси нормалізації, призначені для приведення тексту до певного стандартному виду.

    У стандарті Юнікод визначені 4 форми нормалізації тексту:

    • форма нормалізації D (NFD)   - канонічна декомпозиція. В процесі приведення тексту в цю форму всі складові символи рекурсивно замінюються на кілька складових, відповідно до таблиць декомпозиції.
    • форма нормалізації C (NFC)   - канонічна декомпозиція з подальшою канонічної композицією. Спочатку текст наводиться до форми D, Після чого виконується канонічна композиція - текст обробляється від початку до кінця і виконуються наступні правила:
      • символ S   є початковим, Якщо він має нульовий клас модифікації в базі символів Юнікоду.
      • У будь-якій послідовності символів, що стартує з початкового символу S   символ   C   блокується від S   якщо і тільки якщо між S і C   є який-небудь символ B, Який або є початковим, або має однаковий або більший клас модифікації, ніж C. Це правило поширюється тільки на рядки минулі канонічну декомпозицію.
      • первинним   композитом вважається символ, у якого є канонічна декомпозиція в базі символів Юнікоду (або канонічна декомпозиція для хангиля і він не входить в список виключень.
      • символ X   може бути первинно суміщений з символом   Y   якщо і тільки якщо існує первинний композит Z, Канонічно еквівалентний послідовності<X, Y>.
      • Якщо черговий символ Cне блокується останнім зустрінутим початковим базовим символом L, І він може бути успішно первинно суміщений з ним, то   L   замінюється на композит L-C, а C   видаляється.
    • форма нормалізації KD (NFKD) - сумісна декомпозиція. При приведенні в цю форму всі складові символи замінюються використовуючи як канонічні карти декомпозиції Юникода, так і сумісні карти декомпозиції, після чого результат ставиться в канонічному порядку.
    • форма нормалізації KC (NFKC) - сумісна декомпозиція з подальшою канонічної   композицією.

    Терміни «композиція» та «декомпозиція» розуміють під собою відповідно з'єднання або розкладання символів на складові частини.

    приклади

    Початковий текстNFD NFC NFKD NFKC
    Français (Fran \\ xe7ais) Franc\\ u0327 ais Fran \\ xe7ais Franc \\ u0327ais Fran \\ xe7ais
    А, Е, Й (\\ u0410 \\ u0401 \\ u0419)\\ U0410, \\ u0401, \\ u0419\\ U0410, \\ u0415 \\ u0308 \\ u0418 \\ u0306\\ U0410, \\ u0401, \\ u0419
    ? (\\ U304c)\\ U304b \\ u3099\\ u304c\\ U304b \\ u3099\\ u304c
    Henry   IVHenry   IVHenry   IVHenry   IVHenry   IV
    Henry ? (Henry   \\ U2163)Henry   \\ u2163Henry   \\ u2163Henry   IVHenry   IV

    двонаправлене лист

    Стандарт Юнікод підтримує писемності мов як з напрямком написання зліва направо (left -to-right, LTR), Так і з написанням справа наліво ( right-to-left, RTL) - наприклад, арабське і єврейське лист. В обох випадках символи зберігаються в «природному» порядку; їх відображення з урахуванням потрібного напрямку письма забезпечується додатком.

    Крім того, Юнікод підтримує комбіновані тексти, що поєднують фрагменти з різним напрямком письма. Дана можливість називається двунаправленность (bidirectional text, BiDi). Деякі спрощені обробники тексту (наприклад, в стільникових телефонах) Можуть підтримувати Юнікод, але не мати підтримки двобічної. Всі символи Юнікоду поділені на кілька категорій: пишуться зліва направо, що пишуться справа наліво, і пишуться в будь-якому напрямку. Символи останньої категорії (в основному це знаки пунктуації) при відображенні приймають напрямок навколишнього їх тексту.

    презентовані символи

    Юнікод включає практично всі сучасні писемності, в тому числі:

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

    З академічної метою додані багато історичних писемності, в тому числі: руни, давньогрецька, єгипетські ієрогліфи, клинопис, писемність майя, етруська алфавіт.

    У Юникоде представлений широкий набір математичних і музичних символів, а також піктограм.

    ISO / IEC 10646

    Консорціум Юнікоду працює в тісному зв'язку з робочою групою ISO / IEC / JTC1 / SC2 / WG2,   яка займається розробкою міжнародного стандарту 10646 ( ISO / IEC 10646). Між стандартом Юникода і ISO / IEC 10646   встановлена ​​синхронізація, хоча кожен стандарт використовує свою термінологію і систему документації.

    Співпраця Консорціуму Юникода з Міжнародною організацією зі стандартизації (англ. International Organization for Standardization, ISO)   почалося в 1991 році. У 1993 році ISOвипустила стандарт DIS 10646.1.   Для синхронізації з ним, Консорціум затвердив стандарт Юнікод версії 1.1, в який були внесені додаткові символи з DIS 10646.1.   В результаті, значення закодованих символів в   Unicode   1.1 і DIS 10646.1   повністю збіглися.

    Надалі співпраця двох організацій продовжилося. У 2000 році стандарт   Unicode   3.0 був синхронізований з ISO / IEC   10646-1: 2000. Майбутня третя версія ISO / IEC   10646 буде синхронізована з Unicode   4.0. Можливо, ці специфікації навіть будуть опубліковані як єдиний стандарт.

    аналогічно форматам UTF-16 і UTF-32   в стандарті Юнікод, стандарт ISO / IEC   10646 також має дві основні форми кодування символів: UCS-2   (2 байта на символ, аналогічно UTF-16) і UCS-4   (4 байта на символ, аналогічно UTF-32). UCS   значить універсальний многооктетний   (Мультибайтних) кодований набір символів   (Англ. Universal Multiple-Octet Coded Character Set). UCS-2 можна вважати підмножиною   UTF-16 (UTF-16 без сурогатних пар), а UCS-4 є синонімом для   UTF-32.

    способи подання

    Юнікод має кілька форм представлення (англ. Unicode Transformation Format,   UTF): UTF-8, UTF-16 (UTF-16BE, UTF-16LE) і UTF-32 (UTF-32BE, UTF-32LE).   Була розроблена також форма подання UTF-7 для передачі по семібітним каналах, але через несумісність з ASCII   вона не набула поширення і не включена в стандарт. 1 квітня 2005 р було запропоновано дві жартівливі форми подання: UTF-9 і UTF-18 (RFC 4042).

    В Microsoft Windows   NT   і заснованих на ній системах Windows   2000 і Windows XP   в основному використовується форма   UTF-16LE. В UNIX-подібних операційних системах GNU / Linux, BSD   і Mac OS X   прийнята форма   UTF-8 для файлів і UTF-32 або UTF-8 для обробки символів в оперативній пам'яті.

    UTF-8

    UTF-8 - це уявлення Юникода, що забезпечує найкращу сумісність зі старими системами, які використовували 8-бітові символи. Текст, що складається тільки з символів з номером менше 128, при записі в UTF-8 перетворюється в звичайний текст   ASCII. І навпаки, в тексті UTF-8 будь байт із значенням менше 128 зображує символ ASCIIз тим же кодом. Решта символів Юнікоду зображуються послідовностями довжиною від 2 до 6 байтів (на ділі, тільки до 4 байт, оскільки використання кодів більше 221 не планується), в яких перший байт завжди має вид 11xxxxxx, а решта - 10xxxxxx.

    формат   UTF-8 був винайдений 2 вересня 1992 року Кеном Томпсоном і Робом Пайком і реалізований в   Plan   9. Зараз стандарт UTF-8 офіційно закріплений в документах   RFC 3629   і ISO / IEC 10646 Annex D.

    символи UTF-8 виходять з Unicode   наступним чином:

    Unicode UTF-8 0x00000000 - 0x0000007F: 0xxxxxxx 0x00000080 - 0x000007FF: 110xxxxx 10xxxxxx 0x00000800 - 0x0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx 0x00010000 - 0x001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

    (Теоретично можливі, але не включені в стандарт також :) 0x00200000 - 0x03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 0x04000000 - 0x7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

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

    порядок байтів

    У потоці даних   UTF-16 старший байт може записуватися або перед молодшим ( UTF-16 Big Endian), Або після молодшого ( UTF-16 Little Endian). Іноді кодування Юнікод Big Endian (UTF-16BE) називають Юнікодом на протилежне   байтів. Аналогічно існує два варіанти четирёхбайтной кодування - UTF-32BE і UTF-32LE.

    Для визначення формату представлення Юнікоду в текстовому файлі використовується прийом, за яким на початку тексту записується символ U + FEFF ( нерозривний пробіл   нульової довжини), також іменований міткою порядку байтів   (Англ. Byte Order Mark, BOM ). Цей спосіб дозволяє розрізняти UTF-16LE і UTF-16BE, оскільки символу U + FFFE не існує. Також він іноді застосовується для позначення формату UTF-8, хоча до цього формату і не застосовується поняття порядку байтів. Файли, такі цією угодою, починаються з таких послідовностей байтів:

    UTF-8 EF BB BF UTF-16BE FE FF UTF-16LE FF FE UTF-32BE 00 00 FE FF UTF-32LE FF FE 00 00

    На жаль, цей спосіб не дозволяє надійно розрізняти UTF-16LE і UTF-32LE, оскільки символ U + 0000 допускається Юнікод (хоча реальні тексти рідко починаються з нього).

    реалізації

    Більшість сучасних операційних систем в тій чи іншій мірі забезпечують підтримку Юнікоду.

    В операційних системах сімейства Windows NT для внутрішнього представлення імен файлів і інших системних рядків використовується двухбайтовая кодування UTF-16LE. Системні виклики, які беруть строкові параметри, існують в однобайтном і двухбайтное варіантах. Детальніше див. У статті Юнікод в операційних системах Microsoft.

    UNIX-образні операційні системи, в тому числі, GNU / Linux, BSD, Mac OS X, Використовують для подання Юникода кодування UTF-8. Більшість програм можуть працювати з UTF-8 як з традиційними однобайтном кодуваннями, не звертаючи уваги на те, що символ представляється як кілька послідовних байт. Для роботи з окремими символами рядка зазвичай перекодуються в UCS-4, так що кожному символу відповідає машинне слово.

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

    методи введення

    Оскільки жодна розкладка клавіатури не може дозволити вводити всі символи Юнікоду одночасно, від операційних систем і прикладних програм потрібна підтримка альтернативних методів   введення довільних символів Юнікоду.

      Microsoft Windows

    Починаючи з Windows   2000, службова програма «Таблиця символів» дозволяє вивести на екран таблицю всіх символів від U + 0000 до U + FFFF, підтримуваних конкретним шрифтом. Ця програма дозволяє виділяти окремі символи і копіювати їх в буфер обміну. Таблиця символів, аналогічна за функціональністю цій програмі, включена і в деякі прикладні програми, наприклад,   Microsoft Word.

    Більш універсальний спосіб введення символу, код якого відомий - затиснути Alt, натиснути клавішу «плюс» в додатковому блоці клавіатури, і потім набрати шістнадцятковий код потрібного символу. Наприклад, натискання Alt + Plus + f1   вставить букву «ñ». Цей спосіб, проте, працює не у всіх елементах управління, що дозволяють вводити текст.

    У деяких додатках, наприклад, WordPad, Word і Opera7.5, працює ще один спосіб введення символів по шістнадцятиричним коду: потрібно набрати цей код, і натиснути Alt + X.   Код буде замінений на відповідний символ. Працює і зворотне перетворення: якщо виділити символ і натиснути Alt + X,   то цей символ буде замінений на його шістнадцятковий код.

    Macintosh

    В Mac OS   8.5 і пізніших версіях підтримується метод введення, званий « Unicode Hex Input». При затиснутою клавіші Option   потрібно набрати чотиризначний шістнадцятковий код потрібного символу. Цей метод дозволяє вводити символи з кодами, великими U + FFFF, використовуючи пари сурогатів; такі пари операційною системою будуть автоматично замінені на поодинокі символи. Цей метод введення перед використанням потрібно активізувати в відповідному розділі системних налаштувань, і потім вибрати як поточний метод введення в меню клавіатури.

    Починаючи з Mac OS X   10.2, існує також додаток « Character Palette», Що дозволяє вибирати символи з таблиці, в якій можна виділяти символи певного блоку або символи, які підтримуються конкретним шрифтом.

    GNU / Linux

    В   GNOME   також є утиліта «Таблиця символів», що дозволяє відображати символи певного блоку або системи письма, і надає можливість пошуку за назвою або опису символу. Коли код потрібного символу відомий, його можна ввести відповідно до стандарту ISO14755: при затиснутих клавішах Ctrl і Shift   ввести шістнадцятковий код (в GNOMEверсії 2.15 або більш пізньої введення коду потрібно випередити натисканням клавіші « U»). Введений шістнадцятковий код може мати до 32 біт в довжину, дозволяючи вводити будь-які символи Юнікоду без використання сурогатних пар.

    всі додатки X Window, включаючи GNOME і KDE, Підтримують введення за допомогою клавіші   Compose. Для клавіатур, на яких немає окремої клавіші Compose, для цієї мети можна призначити будь-яку клавішу - наприклад, CapsLock.

    консоль   GNU / Linux   також допускає введення символу Юникода по його коду - для цього десятковий код символу потрібно ввести цифрами розширеного блоку клавіатури при затиснутою клавіші   Alt. Можна вводити символи і по їх шістнадцятиричним коду: для цього потрібно затиснути клавішу   AltGr, І для введення цифр A-F використовувати клавіші розширеного блоку клавіатури від NumLock   до Enter   (за годинниковою стрілкою). Підтримується також і введення відповідно до   ISO   14755. Для того, щоб перераховані способи могли працювати, потрібно включити Юнікодние режим консолі викликом unicode_start (1) і вибрати відповідний шрифт викликом setfont (8).

    Mozilla Firefox   для   Linux   підтримує введення символів по   ISO 14755.

    проблеми Юникода

    Як будь-яка винайдена людиною система, Юнікод не вільний від недоліків (хоча, в основному, вони пов'язані з можливостями оброблювачів тексту, а не безпосередньо з принципом кодування).

    • Деякі системи листи все ще не представлені належним чином в Юникоде. Наприклад, відсутні деякі букви традиційної писемності церковнослов'янської мови. Ця писемність містить багато додаткових графічних елементів   (Такі, як титла і виносні літери). Зображення «довгих» надрядкових символів, що тягнуться над декількома буквами, поки не реалізовано.
    • Тексти на китайською, корейською та японською мовою мають традиційне написання зверху вниз, починаючи з правого верхнього кута. Перемикання горизонтального і вертикального написання для цих мов не передбачено в Юникоде - це повинно здійснюватися засобами мов розмітки або внутрішніми механізмами текстових процесорів.
    • Первісна версія Юникода передбачала наявність великої кількості готових символів, в подальшому було віддано перевагу поєднанню букв з діакритичними модифікують знаками ( Combining diacritics). Наприклад, російські букви Е (U + 0401) і Й (U + 0419) існують у вигляді монолітних символів, хоча можуть бути представлені і набором базового символу з подальшим діакритичним знаком, Тобто в складовою формі ( Decomposed): Е +? (U + 0415 U + 0308), І +? (U + 0418 U + 0306). У той же час безліч символів з мов з алфавітами на основі кирилиці не мають монолітних форм.
    • Юнікод передбачає можливість різних накреслень одного і того ж символу в залежності від мови. Так, китайські ієрогліфи можуть мати різні накреслення в китайському, японському (кандзі) та корейською ( ханчча), Але при цьому в Юникоде позначатися одним і тим же символом (так звана CJK-уніфікація), хоча спрощені і повні ієрогліфи все ж мають різні коди. Часто виникають накладки, коли, наприклад, японський текст виглядає «по-китайськи». Аналогічно, російська і сербська мови використовують різний накреслення курсивних букв при написанні і т (в сербському вони виглядають як і і ш). Тому потрібно стежити, щоб текст завжди був правильно позначений як відноситься до того чи іншої мови.
    • Файли з текстом в Юникоде займають більше місця в пам'яті, так як один символ кодується не одним байтом, як в різних національних кодуваннях, а послідовністю байтів (виняток становить UTF-8 для мов, алфавіт яких укладається в ASCII). Однак зі збільшенням потужності комп'ютерних систем і здешевленням пам'яті і дискового простору ця проблема стає все менш суттєвою.
    • Хоча підтримка Юнікоду реалізована в найбільш поширених операційних системах, не все прикладне програмне забезпечення підтримує коректну роботу з ним. Зокрема, не завжди обробляються мітки BOM і погано підтримуються діакритичні символи. Проблема є тимчасовою і є наслідок порівняльної новизни стандартів Юникода (в порівнянні з однобайтового національними кодуваннями).
    «Юнікод» або «Унікод»?

    « Unicode»- одночасно і власна назва (або частина імені, наприклад Unicode Consortium), Та власну назву, що відбувається з англійської мови.

    Юнікод, або Унікод (англ. Unicode) - стандарт кодування символів, що дозволяє представити знаки практично всіх письмових язиков.Стандарт запропонований в 1991 році некомерційною організацією «Консорціум Юнікоду» (англ. Unicode Consortium), яка об'єднує найбільші IT-корпорації. Застосування цього стандарту дозволяє закодувати дуже велике число символів з різних писемностей: у документах Unicode можуть сусідити китайські ієрогліфи, математичні символи, букви грецького алфавіту, латиниці і кирилиці, при цьому стають непотрібними кодові страніци.Стандарт складається з двох основних розділів: універсальний набір символів ( UCS, Universal Character Set) і сімейство кодувань (UTF, Unicode Transformation Format). Універсальний набір символів задає однозначну відповідність символів кодам - ​​елементам кодового простору, що представляє невід'ємні цілі числа. Сімейство кодувань визначає машинне представлення послідовності кодів UCS.Коди в стандарті Unicode розділені на кілька областей. Область з кодами від U + 0000 до U + 007F містить символи набору ASCII з відповідними кодами. Далі розташовані області знаків різних писемностей, знаки пунктуації та технічні символи. Частина кодів зарезервована для використання в майбутньому. Під символи кирилиці виділені коди від U + 0400 до U + 052F Передумови створення і розвиток ЮнікодаК кінця 1980-х років стандартом стали 8-бітові символи, при цьому існувало безліч різних 8-бітних кодувань і постійно з'являлися все нові. Це пояснювалося як постійним розширенням кола підтримуваних мов, так і прагненням створити систему кодування, частково сумісну з якої-небудь іншої (характерний приклад - поява альтернативної кодування для російської мови, обумовлене експлуатацією західних програм, створених для кодування CP437). В результаті з'явилася необхідність вирішення декількох завдань: Проблема «крокозябра» (показу документів в неправильному кодуванні): її можна було вирішити або послідовним впровадженням методів вказівки використовуваного кодування, або впровадженням єдиної для всіх кодування. Проблема обмеженості набору символів: її можна було вирішити або перемиканням шрифтів всередині документа, або впровадженням «широкої» кодування. Перемикання шрифтів здавна практикувалося в текстових процесорах, причому часто використовувалися шрифти з нестандартною кодуванням, т. Н. «Dingbat fonts» - в результаті при спробі перенести документ в іншу систему все нестандартні символи перетворювалося в крокозябри. Проблема перетворення одного кодування в іншу: її можна було вирішити або складанням таблиць перекодування для кожної пари кодувань, або використанням проміжного перетворення в третю кодування, що включає всі символи всіх кодувань. Проблема дублювання шрифтів: традиційно для кожного кодування робився свій шрифт, навіть якщо ці кодування частково (або повністю) збігалися по набору символів: цю проблему можна було вирішити, роблячи «великі» шрифти, з яких потім вибираються потрібні для даного кодування символи - однак це вимагає створення єдиного реєстру символів, щоб визначати, чому що відповідає. Було визнано за необхідне створення єдиної «широкої» кодування. Кодування зі змінною довжиною символу, широко використовуються в Східній Азії, були визнані занадто складними у використанні, тому було вирішено використовувати символи фіксованої ширини. Використання 32-бітних символів здавалося занадто марнотратним, тому було вирішено використовувати 16-бітние.Такім чином, перша версія Юникода представляла собою кодування з фіксованим розміром символу в 16 біт, тобто загальне число кодів було 216 (65 536). Звідси походить практика позначення символів чотирма шестнадцатерічнимі цифрами (наприклад, U + 0410). При цьому в Юникоде планувалося кодувати не всі існуючі символи, а тільки ті, які необхідні в повсякденному побуті. Рідко використовувані символи повинні були розміщуватися в «області символів для приватного використання» (Private Use Area), яка спочатку займала коди U + D800 ... U + F8FF. Щоб використовувати Юнікод також і в якості проміжної ланки при перетворенні різних кодувань один в одного, в нього включили всі символи, представлені у всіх більш-менш відомих кодіровках.В надалі, однак, було прийнято рішення кодувати всі символи і в зв'язку з цим значно розширити кодову область. Одночасно з цим, коди символів стали розглядатися не як 16-бітові значення, а як абстрактні числа, які в комп'ютері можуть представлятися безліччю різних способов.Поскольку в ряді комп'ютерних систем (наприклад, Windows NT) вже були реалізовані 16-бітові символи, було вирішено все найбільш важливе кодувати тільки в межах перших 65 536 позицій (так звана англ. Basic Multilingual Plane, BMP). Інший простір використовується для «Додаткових символів» (англ. Supplementary Characters): систем письма вимерлих мов або дуже рідко використовуваних китайських ієрогліфів, математичних і музичних символів. Для сумісності зі старими 16-бітними системами була винайдена система UTF-16, де перші 65 536 позицій відображаються безпосередньо як 16-бітові числа, а решта представляються у вигляді «сурогатних пар» (перший елемент пари з області U + D800 ... U + DBFF , другий елемент пари з області U + DC00 ... DFFF). Для сурогатних пар була використана частина кодового простору, раніше відведеного для «символів для приватного використання» .Оскільки в UTF-16 можна відобразити тільки 220 + 216 (1 114 112) символів, то це і було обрано в якості остаточної величини кодового простору Юнікоду. хоча кодова область Юникода була розширена за межі 216 вже у версії 2.0, перші символи в «верхній» області були розміщені тільки у версії 4.0. Версії ЮнікодаПо міру зміни і поповнення таблиці символів системи Юникода і виходу нових версій цієї системи, - а ця робота ведеться постійно, оскільки спочатку система Юнікод включала тільки Plane 0 - двухбайтное коди, - виходять і нові документи ISO. Система Юнікод існує в цілому в наступних версіях: 1.1 (відповідає стандарту ISO / IEC 10646-1: 1993), 2.0, 2.1 (той же стандарт ISO / IEC 10646-1: 1 993 плюс доповнення: «Amendments» з 1-го по 7-е і «Technical Corrigenda» 1 і 2), 3.0 (стандарт ISO / IEC 10646-1: 2000). 3.2 (стандарт 2002 роки) 4.0 (стандарт 2003) 4.01 (стандарт 2004) 4.1 (стандарт 2005) 5.0 (стандарт 2006) Кодова пространствоХотя форми записи UTF-8 і UTF-32 дозволяють кодувати до 231 (2 147 483 648) кодових позицій, було прийнято рішення використовувати лише 220 + 216 (1 114 112) для сумісності з UTF-16. Втім, навіть і цього більш ніж достатньо - сьогодні (у версії 5.0) використовується трохи більше 99 000 кодових позіцій.Кодовое простір розбито на 17 площин по 216 (65536) символів. Нульова площина називається базовою, в ній розташовані символи найбільш уживаних писемностей. Перша площина використовується, в основному, для історичних писемностей. Площині 16 і 17 виділені для приватного употребленія.Для позначення символів Unicode використовується запис виду «U + xxxx» (для кодів 0 ... FFFF) або «U + xxxxx» (для кодів 10000 ... FFFFF) або «U + xxxxxx» (для кодів 100000 ... 10FFFF), де xxx - шістнадцяткові цифри. Наприклад, символ «я» (U + 044F) має код 044F16 = 110310. Система кодірованіяУніверсальная система кодування (Юнікод) являє собою набір графічних символів і спосіб їх кодування для комп'ютерної обробки текстових данних.Графіческіе символи - це символи, які мають видиме зображення. Графічним символам протиставляються керуючі символи і символи форматірованія.Графіческіе символи включають в себе наступні групи: літери, що містяться хоча б в одному з обслуговуваних алфавітів; цифри; знаки пунктуації; спеціальні знаки (математичні, технічні, ідеограми та ін.); роздільники. Юнікод - це система для лінійного представлення тексту. Символи, що мають додаткові над- або підрядкові елементи, можуть бути представлені у вигляді побудованої за певними правила