UTF-8
UTF-8 (от англ. Unicode Transformation Format, 8-bit — «формат преобразования Юникода, 8-битный») — одна из общепринятых и стандартизированных кодировок текста, которая позволяет хранить символы Unicode. Стандарт UTF-8 официально закреплён в документах RFC 3629 и ISO/IEC 10646 Annex D. Нашла широкое применение в операционных системах и веб-пространстве[1]. Сам же формат UTF-8 был изобретён 2 сентября 1992 года Кеном Томпсоном и Робом Пайком и реализован в Plan 9.[2] В качестве BOM использует последовательность байт EF16, BB16, BF16 (что у неё самой является трёхбайтовой реализацией символа FEFF16).
Одним из преимуществ является совместимость с ASCII — любые их 7-битные символы отображаются как есть, а остальные выдают пользователю мусор (шум). Поэтому в случае, если латинские буквы и простейшие знаки препинания (включая пробел) занимают существенный объём текста, UTF-8 даёт выигрыш по объёму по сравнению с UTF-16.[3][4]
Содержание |
Принцип кодирования [править]
Кодировка UTF-8 использует значения конкретных битов и учитывает расположение битовых блоков (по сути чисто позиционная). Поэтому она может быть полноценно проиллюстрирована очевидным графическим образом. Если вам требуется быстро реализовать кодирование и раскодирование, то можете воспользоваться следующей схемой:
На схеме в скобках первое «приглушённое» значение представлено в шестнадцатиричном значении и представляет из себя инвертированную битовую маску. Такие маски удобно и оптимально применять на платформах вроде x86 с инструкциями «test» и «and» с флагом ZF для проверки вхождения в диапазон. Большое же число в скобках после дипазона обозначает количество значащих бит, которое способна закодировать данная байтовая последовательность.
Примеры последовательностей [править]
В таблице ниже значения представлены в шестнадцатиричной системе счисления. Порядок байт в значении больше байта: Little Endian. На практике для каждого значения выбирается представление с минимальной длиной байт (большие — не рациональны).
| Значение | 1 байт | 2 байта | 3 байта | 4 байта | 5 байт | 6 байт |
|---|---|---|---|---|---|---|
| 0000 (NUL) |
00 | C0 80 | E0 80 80 | F0 80 80 80 | F8 80 80 80 80 | FC 80 80 80 80 80 |
| 0073 (малая латинская «s») |
73 | C1 B3 | E0 81 B3 | F0 80 81 B3 | F8 80 80 81 B3 | FC 80 80 80 81 B3 |
| 041A (большая кириллическая «К») |
- | D0 9A | E0 90 9A | F0 80 90 9A | F8 80 80 90 9A | FC 80 80 80 90 9A |
| 0BF5 («௵» — год на тамильском) |
- | - | E0 AF B5 | F0 80 AF B5 | F8 80 80 AF B5 | FC 80 80 80 AF B5 |
| D7FF (последний символ перед суррогатом UTF-16) |
- | - | ED 9F BF | F0 8D 9F BF | F8 80 8D 9F BF | FC 80 80 8D 9F BF |
| D800 (первый символ суррогатов UTF-16) |
- | - | ED A0 80 | F0 8D A0 80 | F8 80 8D A0 80 | FC 80 80 8D A0 80 |
| DFFF (последний символ суррогатов UTF-16) |
- | - | ED BF BF | F0 8D BF BF | F8 80 8D BF BF | FC 80 80 8D BF BF |
| E000 (первый символ после суррогатов UTF-16) |
- | - | EE 80 80 | F0 8E 80 80 | F8 80 8E 80 80 | FC 80 80 8E 80 80 |
| 26218 («𦈘» — китайский иероглиф) |
- | - | - | F0 A6 88 98 | F8 80 A6 88 98 | FC 80 80 A6 88 98 |
| 10FFFF (максимальный код Unicode) |
- | - | - | F4 8F BF BF | F8 84 8F BF BF | FC 80 84 8F BF BF |
| 110000 (первый код после максимального Unicode) |
- | - | - | F4 90 80 80 | F8 84 90 80 80 | FC 80 84 90 80 80 |
| ABCDEF (произвольное 5-байтовое) |
- | - | - | - | F8 AA BC B7 AF | FC 80 AA BC B7 AF |
| 7FFFFFFF (максимальный код UCS-4) |
- | - | - | - | - | FD BF BF BF BF BF |
Диапазоны кодирования [править]
В таблице ниже представлены диапазоны кодирования символов Unicode в UTF-8.
| Коды символов Unicode (HEX) | Размер в UTF-8 | Представленные классы символов |
|---|---|---|
00000000 — 0000007F |
1 байт | ASCII, в том числе латинский алфавит, простейшие знаки препинания и арабские цифры |
00000080 — 000007FF |
2 байта | кириллица, расширенная латиница, арабский, армянский, греческий, еврейский и коптский алфавит; сирийское письмо, тана, нко; МФА; некоторые знаки препинания |
00000800 — 0000FFFF |
3 байта | все другие современные формы письменности, в том числе грузинский алфавит, индийское, китайское, корейское и японское письмо; сложные знаки препинания; математические и другие специальные символы |
00010000 — 001FFFFF |
4 байта | музыкальные символы, редкие китайские иероглифы, вымершие формы письменности, 00110000 — 001FFFFF не используется в Unicode |
00200000 — 03FFFFFF |
5 байт | не используется в Unicode |
04000000 — 7FFFFFFF |
6 байт | не используется в Unicode |
Отличительные значения байтов [править]
Отличительные значения байтов представлены в первую очередь для использования в алгоритмах автоматического определения кодировки текста. Первичным признаком можно считать BOM, которая повышает вероятность использования той или иной кодировки (см. отдельную статью). Другим признаком является обнаружение не валидных или сильно маловероятных байт, или же наоборот вероятных. Здесь же следует отметить, что UTF-8 поддерживает кодирование 31-битных кодов UCS-4. Если речь касается символов Unicode, то 5-ти и 6-тибайтовые значения оказываются сильно маловероятными. И есть ещё один примечательный момент — в кодировке UTF-8 возможно избыточное кодирование, что порождает многозначность. Например, ASCII-символ можно закодировать 6-ю вариантами байтовых последовательностей, но это не означает не валидность избыточных байтовых последовательностей. И здесь можно впасть в заблуждение когда первый байт содержит только нулевые биты значения — для последовательностей выше 2-ух байт исключительно это нормально.
Все значения представлены в 16-ричной системе счисления. Под значением «сильно маловероятен» в колонке «статус» следует рассматривать использование кодировщика, который не отбрасывает лидирующие нули.
| Значение байта | Статус | Значение |
|---|---|---|
| 00..7F | без сомнений | ASCII-символы. |
| 80..BF | без сомнений | Любой не первый байт символа. |
| С0..C1 | избыточное кодирование | Первый байт двухбайтового символа, который содержит ASCII-код. |
| C2..DF | без сомнений | Первый байт двухбайтового символа. |
| E0 | небольшие сомнения | Первый байт трёхбайтового символа, но им же могут начинаться символы с избыточным кодированием (последовательности E0 80 и E0 81). |
| E1..EF | без сомнений | Первый байт трёхбайтового символа. |
| F0 | небольшие сомнения | Первый байт четырёхбайтового символа, но им же могут начинаться символы с избыточным кодированием (последовательности F0 80 A0 и ниже по последнему байту). |
| F1..F7 | без сомнений | Первый байт четырёхбайтового символа. |
| F8 | небольшие сомнения | Первый байт пятибайтового символа, но им же могут начинаться символы с избыточным кодированием (последовательности F0 80 и F0 87). |
| F9..FB | без сомнений | Первый байт пятибайтового символа. |
| FC | небольшие сомнения | Первый байт шестибайтового символа, но им же могут начинаться символы с избыточным кодированием (последовательности FС 80 и F0 83). |
| FD | без сомнений | Первый байт шестибайтового символа. |
| FE..FF | однозначно не возможны | Невозможны в UTF-8 исходя из принципа кодирования. У первого байта символа устанавливается столько старших битов, сколько байтов отводится под символ. Их конец обозначается терминальным битом 0, а оставшиеся биты соответствуют старшим битам значения. Байты 254 и 255 в двоичной системе: 111111102 и 111111112. Отсюда очевидно, что у них просто не остаётся битов для значения. |
UTF-8 и ошибки кодирования/раскодирования [править]
Примеры ниже приведены для быстрой ориентации в случаях не корректного раскодирования текста (так называемые кракозябры).
Так выглядит фраза «Человек сейчас увидит лишь то, что ожидает увидеть.» если она воспринята раскодировщиком в кодировке Windows-1251, а не UTF-8:
Человек сейчас увидит лишь то, что ожидает увидеть.
Фраза «Человек сейчас увидит лишь то, что ожидает увидеть.» при двойном кодировании UTF-8 в UTF-8:
Человек сейчас увидит лишь то, что ожидает увидеть.
Самосинхронизация и UTF-16 [править]
Самосинхронизацию в UTF-8 можно рассмотреть когда вашей программе подаются случайные байты и вам нужно определить начало первого символа. Первичным признаком является сброшенный старший бит байта — это ASCII-символ. Если же он установлен, то пропускаем те байты, у которых сброшен бит перед старшим. В остальных случаях можно продолжать посимвольное поточное раскодирование.
UTF-8 обладает свойством самосинхронизации при обработке 8-битными байтами. Альтернативной UTF-8 является кодировка UTF-16, которая уже обрабатывается 16-битными словами. Возможно возникновение сомнения что UTF-16 не является самосинхронизирующейся. В настоящий момент передача данных в компьютере в подавляющем большинстве производится цельными октетами — 8 бит или ничего (см. IPv4, IPv6, SATA для современной аппаратуры и ATA с PATA для недавней). В данных условиях UTF-8 имеет преимущество в характеристике самосихронизации перед UTF-16, если речь касается аппаратной передачи данных или работы с байтовым потоком (чтение Unicode-данных с произвольной позиции). Если же работа осуществляется в оперативной памяти одной машины, то UTF-16 так же является самосинхронизирующейся (если аппаратура способна подавать цельные 16-битные слова).
Максимальный потенциал [править]
До этого рассматривалось кодирование в UTF-8 лишь 32-битных целых без отрицательных значений. Следует отметить, что в стандарте Unicode используются символы лишь до кода 001FFFFF16 включительно. Поэтому даже 32-битных значений может вполне хватить, но этот раздел был включён для полноты изложения в случае использования UTF-8 для кодирования несимвольных данных.
Алгоритм UTF-8 математически позволяет записывать код любой длины. Но для эффективной и надёжной работы алгоритма необходимо ограничение длины кода. Действующий стандарт Unicode 6.х предполагает использование кода до 21-го бита, то есть до 4-х байт в UTF-8.
Правила записи кода в UTF-8
1. Если размер значения кода закодированного в UTF-8 = 1 байт, то
1.1. Старший бит этого байта выставлен в "0", остальные биты - это закодированное в двоичной системе исчисления значение кода;
2. Если размер значения кода закодированного в UTF-8 > 1 байт, то
2.1. Размер в байтах в еденичной системе исчисления UTF-8 кода;
2.2. Затем следует "0" означающий завершение значения размера;
2.3. Затем следует само значение кодируемого кода в двоичной системе исчисления;
2.4. Старшие 2 бита каждого байта, кроме первого - биты признака продолжения и выставлены в:
- bit7="1"
- bit6="0"
2.5. За ними следуют n бит значащих кодируемого в UTF-8 кода.
Следует отметить что "значение кода" или "значение кодируемого кода" - это есть значение кода ещё не закодированного в UTF-8.
Примеры:
| Занимает байт | Кодирует бит | Представление кода по алгоритму UFT-8 |
|---|---|---|
| 1 | 7 | 0xxx-xxxx |
| 2 | 11 | 110x-xxxx 10xx-xxxx |
| 3 | 16 | 1110-xxxx 10xx-xxxx 10xx-xxxx |
| 4 | 21 | 1111-0xxx 10xx-xxxx 10xx-xxxx 10xx-xxxx |
| 5 | 26 | 1111-10xx 10xx-xxxx 10xx-xxxx 10xx-xxxx 10xx-xxxx |
| 6 | 31 | 1111-110x 10xx-xxxx 10xx-xxxx 10xx-xxxx 10xx-xxxx 10xx-xxxx |
| 7 | 36 | 1111-1110 10xx-xxxx 10xx-xxxx 10xx-xxxx 10xx-xxxx 10xx-xxxx 10xx-xxxx |
| 8 | 41 | 1111-1111 100x-xxxx 10xx-xxxx 10xx-xxxx ... 10xx-xxxx |
| 9 | 46 | 1111-1111 1010-xxxx 10xx-xxxx 10xx-xxxx .... 10xx-xxxx |
| 10 | 51 | 1111-1111 1011-0xxx 10xx-xxxx 10xx-xxxx ..... 10xx-xxxx |
| 11 | 56 | 1111-1111 1011-10xx 10xx-xxxx 10xx-xxxx ...... 10xx-xxxx |
| 12 | 61 | 1111-1111 1011-110x 10xx-xxxx 10xx-xxxx ....... 10xx-xxxx |
| 13 | 66 | 1111-1111 1011-1110 10xx-xxxx 10xx-xxxx ........ 10xx-xxxx |
| 14 | 71 | 1111-1111 1011-1111 100x-xxxx 10xx-xxxx ......... 10xx-xxxx |
| 15 | 76 | 1111-1111 1011-1111 1010-xxxx 10xx-xxxx .......... 10xx-xxxx |
| 16 | 81 | 1111-1111 1011-1111 1011-0xxx 10xx-xxxx ........... 10xx-xxxx |
| 17 | 86 | 1111-1111 1011-1111 1011-10xx 10xx-xxxx ............ 10xx-xxxx |
| 18 | 91 | 1111-1111 1011-1111 1011-110x 10xx-xxxx ............. 10xx-xxxx |
| 19 | 96 | 1111-1111 1011-1111 1011-1110 10xx-xxxx .............. 10xx-xxxx |
| 20 | 101 | 1111-1111 1011-1111 1011-1111 100x-xxxx ............... 10xx-xxxx |
Количество бит N, которое кодирует n байт кода в UTF-8, вычисляется по формуле:
N = 7, при n=1
N = n*5+1, при n>1
См. также [править]
Примечания [править]
- ↑ Usage Statistics of Character Encodings for Websites, June 2011 (англ.)
- ↑ http://www.cl.cam.ac.uk/~mgk25/ucs/utf-8-history.txt (англ.)
- ↑ Well, I'm Back String Theory (англ.). Robert O'Callahan (1 March 2008). Архивировано из первоисточника 23 августа 2011. Проверено 1 марта 2008.
- ↑ Ростислав Чебыкин Всем кодировкам кодировка. UTF‑8: современно, грамотно, удобно.. HTML и CSS. Архивировано из первоисточника 23 августа 2011. Проверено 22 марта 2009.
Ссылки [править]
- UTF-8 encoding table and Unicode characters
- UTF-8: Кодирование и декодирование на habrahabr
- UTF-8, UTF-16, UTF-32 & BOM — Вопросы и ответы
- Compatibility Encoding Scheme for UTF-16: 8-Bit (CESU-8)
- Полное описание стандарта Unicode
| Эту статью следует викифицировать.
Пожалуйста, оформите её согласно правилам оформления статей.
|
| Кодировки символов | |||
|---|---|---|---|
| Основы → | алфавит • текст ( файл • данные ) • набор символов • конверсия | ||
| Исторические кодировки → | Докомп.: семафорная (Макарова) • Морзе • Бодо • МТК-2 | Комп.: 6 бит • УПП • RADIX-50 • EBCDIC ( ДКОИ-8 ) • КОИ-7 • ISO 646 | |
| совре- менное 8-битное представ- ление |
символы → | ASCII ( управляющие • печатные ) | не-ASCII ( псевдографика ) |
| 8бит. код.стр. | Разные → Кириллица: КОИ-8 • ГОСТ 19768-87 • MacCyrillic | ||
| ISO 8859 → | 1(лат.) 2 3 4 5(кир.) 6 7 8 9 10 11 12 13 14 15(€) 16 | ||
| Windows → | 1250 1251(кир.) 1252 1253 1254 1255 1256 1257 1258 | WGL4 | ||
| IBM&DOS → | 437 • 850 • 852 • 855 • 866 «альт.» • ( МИК ) • ( НИИ ЭВМ ) | ||
| Много- байтные |
Традиционные → | DBCS ( GB2312 ) • HTML | |
| Unicode → | UTF-16 • UTF-8 • список символов ( кириллица ) | ||
| Связанные темы → |
интерфейс пользователя • раскладка клавиатуры • локаль • перевод строки • шрифт • кракозябры • транслит • нестандартные шрифты • текст как изображение | Утилиты: iconv • recode | |


