Кодування текстової інформації

Ця документація переміщена в архів і не підтримується.

Використання кодування Юнікод

.NET Framework 3.5

Оновлений: Листопад 2007

У додатках, орієнтованих на загальну середу виконання, для перетворення символів з внутрішнього подання (Юнікод) в інший вид використовується кодування. Для зворотного перетворення знаків із зовнішніх кодувань (НЕ Юнікод) у внутрішнє представлення використовується декодування. Простір імен має ряд класів, що дозволяють додаткам кодувати і декодувати символи. Загальні відомості про ці класах см. В розділі.

  Кодування ANSI і ISO

Використовуються для кодування, відмінною від Юнікод. Клас підтримує широкий діапазон кодувань ANSI / ISO.

Наведений нижче приклад коду використовує метод GetEncoding  необхідного об'єкта кодування для конкретної кодової сторінки. метод GetBytes  викликається для потрібного об'єкту кодування для перетворення рядка Юникода в байтовое подання до необхідної кодуванні. На екрані буде відображено байтовое уявлення рядки на конкретній кодової сторінці.

Imports System Imports System.IO Imports System.Globalization Imports System.Text Public Class Encoding_UnicodeToCP Public Shared Sub Main () "Converts ASCII characters to bytes. "Displays the string" s byte representation in the   "Specified code page. "Code page +1252 represents Latin characters.   PrintCPBytes ( "Hello, World!", 1252) "Code page 932 represents Japanese characters.   PrintCPBytes ( "Hello, World!", 932) "Converts Japanese characters.   PrintCPBytes (, 1252) PrintCPBytes ( "\\ U307b, \\ u308b, \\ u305a, \\ u3042, \\ u306d", 932) End Sub Public Shared Sub PrintCPBytes (str As String, codePage As Integer) Dim targetEncoding As Encoding Dim encodedChars () As Byte "Gets the encoding for the specified code page.   targetEncoding = Encoding.GetEncoding (codePage) "Gets the byte representation of the specified string.   encodedChars = targetEncoding.GetBytes (str) "Prints the bytes. Console.WriteLine ( "Byte representation of" (0) "in CP" (1) ":", _ Str, codePage) Dim i As Integer For i = 0 To encodedChars.Length - 1 Console.WriteLine ( "Byte (0): (1)", i, encodedChars (i)) Next i End Sub End Class

Що таке кодування

По-русски «кодуванням» називають і таблицю відповідності символів машинним кодам (англ. Character set), і процес використання цієї таблиці для перекладу інформації з комп'ютерного представлення в людське, і характеристику текстового файлу, що відображає використання в ньому певної системи кодів при відображенні тексту.

Як кодується текст

Безліч символів, використовуваних при записі тексту, в комп'ютерній термінології іменується алфавітом; кількість символів в алфавіті прийнято називати його потужністю. для уявлення текстової інформації  в комп'ютері найчастіше використовується алфавіт потужністю 256 символів. Один його символ несе 8 біт інформації, отже, двійковий код кожного символу займає 1 байт пам'яті комп'ютера. Всі символи такого алфавіту пронумеровані від 0 до 255, і кожному номеру відповідає 8-розрядний двійковий код, який є порядковим номером символу в двійковій системі числення - від 00000000 до 11111111. Стандартними в будь-який кодової таблиці є тільки перші 128 символів з номерами від нуля ( двійковий код 00000000) до 127 (01111111). В їх число входять великі та малі літери латинського алфавіту, цифри, розділові знаки, дужки і т.п. Решта 128 кодів, починаючи зі 128 (двійковий код 10000000) і закінчуючи 255 (11111111), використовуються для кодування букв національних алфавітів, службових та наукових символів.

види кодувань

Найвідомішою таблицею кодування є код ASCII (Американський стандартний код для обміну інформацією). Спочатку він був розроблений для передачі текстів по телеграфу, причому в той час він був 7-бітовим, тобто для кодування символів англійської мови, службових і керуючих символів використовувалися тільки 128 7-бітових комбінацій. При цьому перші 32 комбінації (коду) служили для кодування сигналів (початок тексту, кінець рядка, переклад каретки, дзвінок, кінець тексту і т.д.). При розробці перших комп'ютерів фірми IBM цей код був використаний для представлення символів в комп'ютері. Оскільки в вихідному коді ASCII було всього 128 символів, для їх кодування вистачило значень байта, у яких 8-ий біт дорівнює 0. Значення байта з 8-им бітом, що дорівнює 1, стали використовувати для представлення символів псевдографіки, математичних знаків і деяких символів з мов, відмінних від англійської (грецького, німецьких умляутом, французьких діакритичних знаків і т.п.). Коли стали пристосовувати комп'ютери для інших країн і мов, місця для нових символів вже не стало вистачати. Для того, щоб повноцінно підтримувати крім англійської та інших мов, фірма IBM ввела в вживання кілька кодових таблиць, орієнтованих на конкретні країни. Так для скандинавських країн було запропоновано таблиця 865 (Nordic), для арабських країн - таблиця 864 (Arabic), для Ізраїлю - таблиця 862 (Israel) і так далі. У цих таблицях частина кодів з другої половини кодової таблиці використовувалася для представлення символів національних алфавітів (за рахунок виключення деяких символів псевдографіки). З російською мовою ситуація розвивалася особливим чином. Очевидно, що заміну символів у другій половині кодової таблиці можна зробити різними способами. Ось і з'явилися для російської мови кілька різних таблиць кодування символів кирилиці: KOI8-R, IBM-866, CP-1251, ISO-8551-5. Всі вони однаково зображують символи першої половини таблиці (від 0 до 127) і розрізняються поданням символів російського алфавіту і псевдографіки. Для таких же мов, як китайська чи японська, взагалі 256 символів недостатньо. Крім того, завжди існує проблема виведення або збереження в одному файлі одночасно текстів на різних мовах (наприклад, при цитуванні). Тому була розроблена універсальна кодова таблиця  UNICODE, яка містить символи, що застосовуються в мовах усіх народів світу, а також різні службові та допоміжні символи (знаки пунктуації, математичні і технічні символи, стрілки, діакритичні знаки і т.д.). Очевидно, що одного байта недостатньо для кодування такого великого безлічі символів. Тому в UNICODE використовуються 16-бітові (2-байтові) коди, що дозволяє уявити 65 536 символів. До теперішнього часу задіяно близько: 49 000 кодів (останнє значне зміна - введення символу валюти EURO у вересні 1998 р). Для сумісності з попередніми кодуваннями перші 256 кодів збігаються зі стандартом ASCII. У стандарті UNICODE крім певного двійкового коду (ці коди прийнято позначати буквою U, після якої йдуть знак + і власне код в шестнадцатиричном поданні) кожному символу присвоєно певне ім'я. Ще одним компонентом стандарту UNICODE є алгоритми для взаємооднозначної перетворення кодів UNICODE в послідовності байтів змінної довжини. Необхідність таких алгоритмів обумовлена ​​тим, що не всі програми вміють працювати з UNICODE. Деякі додатки розуміють тільки 7-бітові ASCII-коди, інші додатки - 8-бітові ASCII-коди. Такі додатки використовують для представлення символів, що не помістилися, відповідно, в 128-символьний або 256-символьний набір, так звані розширені ASCII-коди, коли символи кодуються ланцюжками байтів змінної довжини. Алгоритм UTF-7 служить для оборотного перетворення кодів UNICODE в розширені 7-бітові ASCII-коди, а UTF-8 - для оборотного перетворення кодів UNICODE в розширені 8-бітові ASCII-коди. Відзначимо, що і ASCII, і UNICODE, і інші стандарти кодування символів не визначають зображення символів, а тільки склад набору символів і спосіб його уявлення в комп'ютері. Крім того (що, може бути, не відразу очевидно), дуже важливий порядок перерахування символів в наборі, так як він впливає найістотнішим чином на алгоритми сортування. Саме таблицю відповідності символів з якогось певного набору (скажімо, символів, застосовуваних для подання інформації на англійській мові, або на різних мовах, як у випадку з UNICODE) і позначають терміном таблиця кодування символів або charset. Кожна стандартна кодування має ім'я, наприклад, KOI8-R, ISO_8859-1, ASCII. На жаль, стандарту на імена кодувань не існує.

поширені кодування

   ISO 646 o ASCII EBCDIC ISO 8859: o ISO 8859-1 - ISO 8859-11, ISO 8859-13, ISO 8859-14, ISO 8859-15 o CP437, CP737, CP850, CP852, CP855, CP857, CP858, CP860, CP861, CP863, CP865, CP866, CP869 кодування Microsoft Windows: o Windows-1250 для мов Центральної Європи, які використовують латинське написання букв o Windows-1251 для кириличних алфавітів o Windows -1252 для західних мов o Windows-1253 для грецької мови o Windows-тисяча двісті п'ятьдесят чотири для турецької мови o Windows-1255 для івриту o Windows-1 256 для арабської мови o Windows-+1257 для балтійських мов o Windows-1 258 для в'єтнамської мови MacRoman, MacCyrillic КОІ8 (KOI8-R, KOI8-U ...), ЯКІ-7 Болгарська кодування ISCII VISCII Big5 (найбільш знаменитий варіант Microsoft CP950 ) o HKSCS Guobiao o GB2312 o GBK (Microsoft CP936) o GB18030 Shift JIS для японської мови (Microsoft CP932) EUC-KR для корейської мови (Microsoft CP949) ISO-2022 і EUC для китайської писемності Кодування UTF-8 і UTF-16 набору символів Юнікод

Унікод являє собою систему кодування символів, яка використовується комп'ютерами для зберігання та обміну текстовими даними. У Унікод є унікальний номер (unique number) (або кодовий знак) (code point) для кожного символу основних світових систем писемності. У цю систему також включені технічні символи, знаки пунктуації та багато інших символи, використовувані в писемності.

Крім того, що Унікод є таблицею кодів символів (character map), він також включає в себе алгоритми для зіставлення і кодування двосторонньої писемності, наприклад, арабської, а також специфікації для нормалізації текстових форм.

В даному розділі наводиться загальний опис УНІКОД. Для отримання більш повної інформації і списку підтримуваних мов, символи яких можна закодувати за допомогою Unicode, см.Веб-сайт Unicode Consortium.

Кодові знаки (Code points)

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

Образ символу (гліф), який відображається, або візуальне представлення символу, є знаком, який виводиться на екрані монітора або роздрукованої сторінці. У деяких системах записи один символ може використовуватися декількома гліфів, або кілька символів може відповідати одному гліфів. Наприклад, «ll» в іспанській мові є одним гліфом, але двома символами: «l» і «l».

У Унікод символи перетворюються в кодові знаки (code point). Кодові знаки являють собою числа, які призначаються Unicode Consortium для кожного символу в кожній системі запису. Кодові знаки представлені у вигляді запису «U +» і чотирьох чисел і / або букв. Нижче наводяться приклади кодових знаків (code points) для чотирьох різних символів: рядкова l, рядкова u з умляутом, бета і малої e з Акут.

Унікод містить 1,114,112 кодових значень (code points); на теперішній момент  часу, для них призначено більш 96,000 символів.

Рівні (Planes)

Кодова простір УНІКОД для символів розділене на 17 рівнів (plane), кожен з яких містить 65,536 кодових знаків.

Першим рівнем (plane) -plane 0- є Basic Multilingual Plane (BMP). Велика частина найбільш використовуваних символів кодуються за допомогою BMP, і на сьогоднішній день це рівень, на якому закодовано найбільше символів. BMP містить кодові знаки (code points) для майже всіх символів сучасних мов і багатьох спеціальних символів. В BMP існує близько 6,300 невикористовуваних кодових знаків (code points) .Вони будуть використані для додавання більшої кількості символів в майбутньому.

Наступним рівнем (plane) -plane 1 є Supplementary Multilingual Plane (SMP). SMP використовується для кодування древніх символів, а також музичних і математичних символів.

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

Кодування символів визначає кожен символ, його кодовий знак (code point) і то, як кодовий знак (code point) буде представлений в бітах. Не знаючи, яке кодування використовувалося, ви не зможете інтерпретувати рядок символів коректно.

Існує дуже велика кількість схем кодування, але конвертувати їх дані між ними дуже важко, причому деякі з них можуть врахувати наявність символів більше двох-трьох різних мов. Наприклад, якщо ваш ПК за замовчуванням налаштований на використання OEM-Latin II і ви переглядаєте Веб-сайт, який використовує IBM EBCDIC-Cyrillic, то всі символи, які будуть представлені в Cyrillic, який не буде закодований в схемі Latin II, що не будуть відображатися корректно.Такіе символи будуть заміщені іншими символами, наприклад, знаками питання і квадратами.

Оскільки Унікод містить кодові знаки (code points) для більшості символів у всіх сучасних мовах, то використання кодування символів Унікод дозволить вашому комп'ютеру інтерпретувати практично кожен відомий символ.

Існує три основні схеми Юнікод для кодування символів: UTF-8, UTF-16 і UTF-32. UTF означає Unicode Transformation Format. Числа, які йдуть за UTF, означають розмір одиниць (в байтах), які використовуються для кодування.

  • UTF-8  використовує 8-бітову кодову одиницю змінної ширини. UTF-8 використовує від 1 до 6 байт для кодування символу; вона може використовувати менше, стільки ж або більше байт, ніж UTF-16 для кодування одного і того ж символу. У windows-1251, кожен код від 0 до 127 (U + 0000 to U + 0127) зберігається в одному байті. Тільки кодові знаки від 128 (U + 0128) і вище зберігаються з використанням від 2 до 6 байт.
  • UTF-16  використовує одну 16-бітову кодову одиницю фіксованої ширини. Він порівняно компактний і все найбільш часто використовувані символи можуть бути закодовані за допомогою однієї 16-бітової кодової одиниці (code unit). Інші символи можуть бути доступні при використанні пар 16-бітових кодових одиниць (code units).
  • UTF-32  потрібно 4 байта для кодування будь-якого символу. У більшості випадків документ, закодований за допомогою UTF-32, буде приблизно в два рази більше, ніж такий же документ, закодований за допомогою UTF-16. Кожен символ в ньому кодується за допомогою однієї 32-бітової одиниці кодування фіксованої ширини. Ви можете використовувати UTF-32, якщо ви не обмежені в дисковому просторі і хочете використовувати одну кодову одиницю (code unit) для кожного символу.

Всі три форми кодування можуть кодувати одні і ті ж символи і можуть бути переведені з однієї в іншу без втрати даних.

Існують і інші кодування: наприклад, UTF-7 і UTF-EBCDIC. Існує також кодування GB18030, яка є китайським еквівалентом кодування UTF-8 і підтримує спрощені і традиційні китайські символи. Для російської мови зручно користуватися windows-1251.

Copyright © 1995-2014 Esri. All rights reserved.

Юнікод - це дуже великий і складний світ, адже стандарт дозволяє ні багато ні мало представляти і працювати в комп'ютері з усіма основними письменностями світу. Деякі системи письма існують вже понад тисячу років, причому багато хто з них розвивалися майже незалежно один від одного в різних куточках світу. Люди так багато всього придумали і воно часто настільки несхоже один на одного, що об'єднати все це в єдиний стандарт було вкрай непростий і амбітним завданням.

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

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

Навіщо знадобився Юнікод?

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

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

У такого підходу в цілому і однобайтових кодувань зокрема був ряд істотних недоліків:

  1. Можна було одночасно працювати лише з 256 символами, причому перші 128 були зарезервовані під латинські і керуючі символи, а в другій половині крім символів національного алфавіту потрібно було знайти місце для символів псевдографіки (╔ ╗).
  2. Шрифти були прив'язані до конкретної кодуванні.
  3. Кожна кодування представляла свій набір символів і конвертація з однієї в іншу була можлива тільки з частковими втратами, коли відсутні символи замінювалися на графічно схожі.
  4. Перенесення файлів між пристроями під керуванням різних операційних систем був скрутний. Потрібно було або мати програму-конвертер, або тягати разом з файлом додаткові шрифти. Існування Інтернету яким ми його знаємо було неможливим.
  5. У світі існують неалфавітні системи письма (ієрогліфічне письмо), які в однобайтном кодуванні непредставіми в принципі.

Основні принципи Юникода

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

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

Вводиться поняття абстрактного юнікод-символу, що існує виключно у вигляді умоглядної концепції і домовленості між людьми, закріпленої стандартом. Кожному юнікод-символу поставлено у відповідність невід'ємне ціле число, що називається його кодової позицією (code point).

Так, наприклад, юнікод-символ U + 041F - це заголовна кирилична буква П. Існує кілька можливостей подання даного символу в пам'яті комп'ютера, рівно як і кілька тисяч способів відображення його на екрані монітора. Але при цьому П, воно і в Африці буде П або U + 041F.

Це добре нам знайома інкапсуляція або відділення інтерфейсу від реалізації - концепція, що відмінно зарекомендувала себе в програмуванні.

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

Привіт U + 041F U + 0440 U + 0438 U + 0432 U + 0435 U + 0442
  записати на листочку, упакувати в конверт і переслати в будь-який кінець Землі. Якщо там знають про існування Юникода, то текст буде сприйнятий ними рівно так само, як і нами з вами. У них не буде жодних сумнівів, що передостанній символ - це саме кирилична рядкова е  (U + 0435), а не скажімо латинська маленька e  (U + 0065). Зверніть увагу, що ми ні слова не сказали про байтовому поданні.

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

Приклади різних юнікод-символів

Існують суто технічні юнікод-символи, наприклад:

  • U + 0000: нульовий символ;
  • U + D800-U + DFFF: молодші і старші сурогати для технічного уявлення кодових позицій в діапазоні від 10000 до 10FFFF (читай: за межами БМЯП / BMP) в сімействі кодувань UTF-16;
  • і т.д.
  Існують пунктуаційні маркери, наприклад U + 200F: маркер зміни напряму письма справа-наліво.

Існує ціла когорта прогалин різної ширини і призначення (див. Відмінну Хабра-статтю:):

  • U + 0020 (пробіл);
  • U + 00A0 ( нерозривний пробіл, В HTML);
  • U + 2002 (напівкругла шпація або En Space);
  • U + 2003 (кругла шпація або Em Space);
  • і т.д.
  Існують комбіновані діакритичні знаки (сombining diacritical marks) - всілякі штрихи, точки, тильди і т.д., які змінюють / уточнюють значення попереднього знака та його накреслення. наприклад:
  • U + 0300 і U + 0301: знаки основного (гострого) і другорядного (слабкого) наголосів;
  • U + 0306: коротка (надрядкові дуга), як в й;
  • U + 0303: надрядкового тильда;
  • і т.д.
  Існує навіть така екзотика, як мовні теги (U + E0001, U + E0020-U + E007E, і U + E007F), які зараз знаходяться в підвішеному стані. Вони замислювалися як можливість маркувати певні ділянки тексту як відносяться до того чи іншого варіанту мови (скажімо американський і британський варіант англійської), що могло впливати на деталі відображення тексту.

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

Кодова простір Юникода

  Кодова простір Юникода складається из 1 114 112 кодових позицій в діапазоні від 0 до 10FFFF. З них до дев'ятої версії стандарту значення присвоєно лише 128 237. Частина простору зарезервована для приватного використання і консорціум Юникода обіцяє ніколи не привласнювати значення позиціях з цих спеціальний областей.

Заради зручності весь простір поділено на 17 площин (зараз задіяно шість з них). До недавнього часу було прийнято говорити, що швидше за все вам доведеться зіткнутися тільки з базової багатомовною площиною (Basic Multilingual Plane, BMP), що включає в себе юнікод-символи від U + 0000 до U + FFFF. (Забігаючи трохи вперед: символи з BMP представляються в UTF-16 двома байтами, а не чотирма). У 2016 році ця теза вже викликає сумніви. Так, наприклад, популярні символи Емодзі цілком можуть зустрітися в призначеному для користувача повідомленні і потрібно вміти їх коректно обробляти.

кодування

  Якщо ми хочемо переслати текст через Інтернет, то нам буде потрібно закодувати послідовність Юнікод-символів у вигляді послідовності байтів.

Стандарт Юникода включає в себе опис ряду юнікод-кодувань, наприклад UTF-8 і UTF-16BE / UTF-16LE, які дозволяють кодувати весь простір кодових позицій. Конвертація між цими кодуваннями може вільно здійснюватися без втрат інформації.

Також ніхто не відміняв однобайтні кодування, але вони дозволяють закодувати свій індивідуальний і дуже вузький шматочок юнікод-спектра - максимум 256 кодових позицій. Для таких кодувань існують і доступні всім бажаючим таблиці, де кожному значенню єдиного байта зіставлений юнікод-символ (див. Наприклад CP1251.TXT). Незважаючи на обмеження, однобайтні кодування виявляються досить практичними, якщо мова йде про роботу з великим масивом моноязиковой текстової інформації.

З юнікод-кодувань найпоширенішою в Інтернеті є UTF-8 (вона завоювала пальму першості в 2008 році), головним чином завдяки її економічності і прозорою сумісності з семібітной ASCII. Латинські і службові символи, основні знаки пунктуації та цифри - тобто всі символи семібітной ASCII - кодуються в UTF-8 одним байтом, тим же, що і в ASCII. Символи багатьох основних писемностей, не рахуючи деяких більш рідкісних ієрогліфічних знаків, представлені в ній двома або трьома байтами. Найбільша з певних стандартом кодових позицій - 10FFFF - кодується чотирма байтами.

Зверніть увагу, що UTF-8 - це кодування зі змінною довжиною коду. Кожен юнікод-символ в ній представляється послідовністю кодових квантів з мінімальною довжиною в один квант. Число 8 означає бітову довжину кодового кванта (code unit) - 8 біт. Для сімейства кодувань UTF-16 розмір кодового кванта становить, відповідно, 16 біт. Для UTF-32 - 32 біта.

Якщо ви пересилаєте по мережі HTML-сторінку з кириличним текстом, то UTF-8 може дати досить відчутний виграш, тому що вся розмітка, а також JavaScript і CSS блоки будуть ефективно кодуватися одним байтом. Наприклад головна сторінка  Хабра в UTF-8 займає 139Кб, а в UTF-16 вже 256Кб. Для порівняння, якщо використовувати win-1251 з втратою можливості зберігати деякі символи, то розмір, в порівнянні з UTF-8, скоротиться всього на 11Кб до 128Кб.

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

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

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

У сухому залишку

  Інформації багато і має сенс навести коротку вижимки за все, що було написано вище:
  • Юнікод постулює чітке розмежування між символами, їх поданням до комп'ютері і їх відображенням на пристрої виведення.
  • Юнікод-символи не завжди відповідають символу в традиційно-наївному розумінні, наприклад букві, цифрі, розділових знаків або ієрогліфу.
  • Кодова простір Юникода складається из 1 114 112 кодових позицій в діапазоні від 0 до 10FFFF.
  • Базова багатомовна площину включає в себе юнікод-символи від U + 0000 до U + FFFF, які кодуються в UTF-16 двома байтами.
  • Будь-яка юнікод-кодування дозволяє закодувати весь простір кодових позицій Юникода і конвертація між різними такими кодуваннями здійснюється без втрат інформації.
  • Однобайтні кодування дозволяють закодувати лише невелику частину юнікод-спектра, але можуть виявитися корисними при роботі з великим об'ємом моноязиковой інформації.
  • Кодування UTF-8 і UTF-16 мають змінною довжиною коду. В UTF-8 кожен юнікод-символ може бути закодований одним, двома, трьома або чотирма байтами. В UTF-16 - двома або чотирма байтами.
  • Внутрішній формат зберігання текстової інформації в рамках окремої програми може бути довільним за умови коректної роботи з усім простором кодових позицій Юникода і відсутності втрат під час транскордонного передачі даних.

Короткий зауваження про кодування

З терміном кодування може статися деяка плутанина. В рамках Юникода кодування відбувається двічі. Перший раз кодується набір символів Юнікоду (character set), в тому сенсі, що кожному юнікод-символу ставиться з відповідність кодова позиція. В рамках цього процесу набір символів Юнікоду перетворюється в кодований набір символів (coded character set). Другий раз послідовність Юнікод-символів перетворюється в рядок байтів і цей процес також називається кодування.

В англомовній термінології існують два різних дієслова to code і to encode, але навіть носії мови часто в них плутаються. До того ж термін набір символів (character set або charset) використовується як синонім до терміну кодований набір символів (coded character set).

Все це ми говоримо до того, що має сенс звертати увагу на контекст і розрізняти ситуації, коли мова йде про кодової позиції абстрактного юнікод-символу і коли мова йде про його байтовому поданні.

На закінчення

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