Що таке UTF-16 та UTF-8

Що таке кодування символів, як ANSI та Unicode, і чим вони відрізняються?

ASCII, UTF-8, ISO-8859 . Можливо, ви бачили ці дивні прізвиська, що плавають навколо, але що вони насправді означають? Прочитайте далі, коли ми пояснюємо, що таке кодування символів і як ці скорочення стосуються простого тексту, який ми бачимо на екрані.

Фундаментальні будівельні блоки

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

(Порівняння сценаріїв Grantha, Tulu та Malayalam, Зображення з Вікіпедія )

У світі комп’ютерів ми використовуємо термін „персонаж”. Символ – це свого роду абстрактне поняття, яке визначається конкретними параметрами, але воно є основною одиницею значення. Латинське «А» – це не те саме, що грецьке «альфа» чи арабське «аліф», оскільки вони мають різний контекст – вони з різних мов і мають дещо різну вимову – тож ми можемо сказати, що це різні символи. Візуальне зображення символу називається «гліфом», а різні набори гліфів називаються шрифтами. Групи персонажів належать до “набору” або “репертуару”.

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

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

Коли ви вводите щось на клавіатурі або завантажуєте файл, як комп’ютер знає, що відображати? Для цього призначене кодування символів. Текст на вашому комп’ютері насправді не букви, це ряд спарених буквено-цифрових значень. Кодування символів діє як ключ, значення якого відповідають яким символам, подібно до того, як орфографія диктує, які звуки відповідають яким буквам. Код Морзе – це своєрідне кодування символів. Це пояснює, як групи довгих і коротких одиниць, такі як звукові сигнали, представляють символи. У азбуці Морзе символи – це лише англійські літери, цифри та крапки. Існує багато комп’ютерних кодувань символів, які перекладаються на літери, цифри, знаки наголосу, розділові знаки, міжнародні символи тощо.

Часто в цій темі також використовується термін “кодові сторінки”. Вони, по суті, є кодуванням символів, як використовується певними компаніями, часто з невеликими змінами. Наприклад, кодова сторінка Windows 1252 (раніше відома як ANSI 1252) є модифікованою формою ISO-8859-1. Вони в основному використовуються як внутрішня система для посилання на стандартне та модифіковане кодування символів, характерне для тих самих систем. На початку кодування символів було не настільки важливим, оскільки комп’ютери не спілкувались між собою. З ростом популярності Інтернету, а мережами є звичним явищем, він стає все більш важливим у нашому повсякденному житті, навіть не усвідомлюючи цього.

Багато різних типів

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

Давайте розглянемо деякі з найбільш поширених.

(Уривок таблиці ASCII, Зображення з asciitable.com )

  • ASCII – Американський стандартний код для обміну інформацією є одним із старих кодувань символів. Спочатку він був розроблений на основі телеграфних кодів і розвивався з часом, щоб включати більше символів та деякі застарілі недруковані контрольні символи. Це, мабуть, настільки базове, наскільки це можливо з точки зору сучасних систем, оскільки воно обмежене латинським алфавітом без наголошених символів. Його 7-бітне кодування дозволяє мати лише 128 символів, тому у всьому світі використовується кілька неофіційних варіантів.
  • ISO-8859 – Найбільш вживаною групою кодування символів Міжнародної організації зі стандартизації є номер 8859. Кожне конкретне кодування позначається цифрою, яка часто має префікс описовим прізвищем, наприклад ISO-8859-3 (латинська-3), ISO-8859-6 (латинська / арабська). Це надмножина ASCII, що означає, що перші 128 значень у кодуванні збігаються з ASCII. Однак він 8-розрядний і дозволяє використовувати 256 символів, тому він будується звідти і включає набагато ширший набір символів, причому кожне конкретне кодування фокусується на різному наборі критеріїв. Латиниця-1 включала купу наголошених букв та символів, але пізніше була замінена переробленим набором під назвою Latin-9, що включає оновлені символи, такі як символ євро.

(Уривок тибетського сценарію, Unicode v4, з unicode.org )

  • Юнікод – Цей стандарт кодування націлений на універсальність. На даний момент він включає 93 сценарії, організовані в кілька блоків, і ще багато з них працюють. Юнікод працює інакше, ніж інші набори символів, оскільки замість прямого кодування гліфа кожне значення направляється далі до «кодової точки». Це шістнадцяткові значення, які відповідають символам, але самі гліфи надаються окремо програмою, наприклад, вашим веб-браузером. Ці кодові точки зазвичай зображуються наступним чином: U + 0040 (що перекладається як ‘@’ ). Конкретними кодуваннями за стандартом Unicode є UTF-8 та UTF-16. UTF-8 намагається забезпечити максимальну сумісність з ASCII. Він 8-розрядний, але дозволяє використовувати всі символи за допомогою механізму заміни та кількох пар значень на символ. UTF-16 втрачає ідеальну сумісність з ASCII для більш повної 16-бітової сумісності зі стандартом.
  • ISO-10646 – Це не фактичне кодування, а лише набір символів Unicode, який стандартизований ISO. Це в основному важливо, оскільки це репертуар символів, який використовується HTML. Деякі з більш розширених функцій, що надаються Unicode, що дозволяють здійснювати сортування та справа наліво поряд із сценаріями зліва направо, відсутні. Тим не менше, він дуже добре працює для використання в Інтернеті, оскільки дозволяє використовувати широкий спектр сценаріїв і дозволяє браузеру інтерпретувати гліфи. Це дещо полегшує локалізацію.

Яке кодування слід використовувати?

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

(Кілька мов в одному документі, знімок екрана gujaratsamachar.com )

Однак у кожного набору є недоліки. Знаки пунктуації ASCII обмежені, тому він не працює неймовірно добре для друкарських правильних редагувань. Ви коли-небудь вводили копію / вставку із Word лише для того, щоб мати якусь дивну комбінацію гліфів? Це недолік ISO-8859, або, вірніше, його передбачувана взаємодія зі специфічними для ОС кодовими сторінками (ми розглядаємо ВАС, Microsoft!). Основним недоліком UTF-8 є відсутність належної підтримки при редагуванні та публікації додатків. Інша проблема полягає в тому, що браузери часто не інтерпретують і просто відображають позначку порядку байтів символу, закодованого UTF-8. Це призводить до відображення небажаних гліфів. І звичайно, декларування одного кодування та використання символів з іншого без належного декларування / посилання на них на веб-сторінці ускладнює браузерам їх правильну візуалізацію, а пошуковим системам – належним індексом.

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

Is UTF-16 compatible with UTF-8?

I asked Google the question above and was sent to Difference between UTF-8 and UTF-16? which unfortunately doesn’t answer the question. From my understanding UTF-8 should be a subset of UTF-16 meaning: if my code uses UTF-16 and I hand in a UTF-8 encoded string everything should always be fine. The other way around (expecting UTF-8 and getting UTF-16) may cause problems. Is that correct? EDIT: To clarify why the linked SO question doesn’t answer my question: My problem arose when trying to process a JSON string using WebClient.DownloadString , because the WebClient used the wrong encoding. The JSON I received from the request was encoded as UTF-8 and the question for me was: if I set webClient.Encoding = New System.Text.UnicodeEncoding (a.k.a UTF-16) would I be on the safe side, i.e. able to handle UTF-8 and UTF-16 request results, or should I use webClient.Encoding = New System.Text.UTF8Encoding ?

What do you mean by “hand in”? They encode the same set of characters, but a byte sequence in UTF-8 won’t represent the same set of characters if it’s interpreted as UTF-16. It would really help if you’d give more details about what you’re trying to do.

No, that is not correct. Not all UTF-8 encoded bytes are valid UTF-16 bytes, as well as vice versa. There is no way to pick the right encoding that can handle both; you need to know the encoding of your input and treat it accordingly.

1 Answer 1

It’s not entirely clear what you mean by “compatible”, so let’s get some basics out of the way.

Unicode is the underlying concept, and UTF-16 and UTF-8 are two different ways to encode Unicode. They are obviously different — otherwise, why would there be two different serialization formats?

Unicode by itself does not specify a serialization format. UTF-8 and UTF-16 are two alternative serialization formats. There are several others, but these two are arguably the most widely used.

They are “compatible” in the sense that they can represent the same Unicode code points, but “incompatible” in that the representations are completely different, and irreconcileable.

There are two additional twists with UTF-16. Firstly, there are actually two different encodings, UTF-16LE and UTF-16BE. These differ in endianness. (UTF-8 is a byte encoding, so does not have endianness.) Secondly, legacy UTF-16 used to be restricted to 65,536 possible characters, which is less than Unicode currently contains. This is handled with surrogates, but really old and/or broken UTF-16 implementations (properly identified as UCS-2, not “real” UTF-16) do not support them.

For a bit of concretion, let’s compare four different code points. We pick U+0041, U+00E5, U+201C, and U+1F4A9, as they illustrate the differences nicely.

U+0041 is a 7-bit character, so UTF-8 represents it simply with a single byte. U+00E5 is an 8-bit character, so UTF-8 needs to encode it. U+1F4A9 is outside the Basic Multilingual Plane, so UTF-16 represents it with a surrogate sequence. Finally, U+201C is none of the above.

Here are the representations of our candidate characters in UTF-8, UTF-16LE, and UTF-16BE.

CharacterUTF-8UTF-16LEUTF-16BE
U+0041 (a)0x410x41 0x000x00 0x41
U+00E5 (å)0xC3 0xA50xE5 0x000x00 0xE5
U+201C (“)0xE2 0x80 0x9C0x1C 0x200x20 0x1C
U+1F4A9 (💩)0xF0 0x9F 0x92 0xA90x3D 0xD8 0xA9 0xDC0xD8 0x3D 0xDC 0xA9

To pick one obvious example, the UTF-8 encoding of U+00E5 would represent a completely different character if interpreted as UTF-16 (in UTF-16LE, it would be U+A5C3, and in UTF-16BE, U+C3A5.) Any UTF-8 sequence with an odd number of bytes is an incomplete 16-bit sequence. I suppose UTF-8 when interpreted as UTF-16 could also happen to encode an invalid surrogate sequence. Conversely, many of the UTF-16 codes are not valid UTF-8 sequences at all. So in this sense, UTF-8 and UTF-16 are completely and utterly incompatible.

These are byte values; in ASCII, 0x00 is the NUL character (sometimes represented as ^@ ), 0x41 is uppercase A, and 0xE5 is undefined; in e.g. Latin-1 it represents the character å (which is also conveniently U+00E5 in Unicode), but in KOI8-R it is the Cyrillic character Е (U+0415), etc.

Perhaps notice also how the last example requires a nontrivial transformation in UTF-16, too, using a pair of surrogate code points, in some sense superficially similarly to how UTF-8 encodes all multibyte code points.

Related Post

Чи можна удобрювати свіжим гноємЧи можна удобрювати свіжим гноєм

Зміст:1 Що можна удобрювати свіжим гноєм і як1.1 Коли і як удобрювати рослини гноєм?1.2 Підживлення садових культур1.3 підживлення квітів1.4 Відповідні органічні добрива1.5 Детально про види гною2 Що можна удобрювати гноєм2.1

Дощовий червяк чим харчуютьсяДощовий червяк чим харчуються

Зміст:1 Чим корисні дощові черв’яки і як їх розводити1.1 Чим корисні дощові черв’яки1.1.1 Як зберегти дощових черв’яків2 Користь і шкода дощових черв’яків на городі2.1 Біологічні особливості2.2 Розмноження2.3 Роль біогумусу для

Суниця будова плодаСуниця будова плода

Опис та характеристика рослини Суниці лісові Fragaria vesca, wild strawberry, woodland strawberry, Alpine strawberry, European strawberry, fraise des bois. багаторічна трав’яниста рослина Харчова, вітамінозна, лікарська, танідоносна, косметична рослина. Плоди вживають