UTF-8
| UTF-8 | |
|---|---|
| Производная работа | CESU-8 |
| Создатель | Роб Пайк и Кен Томпсон |
| Язык произведения или названия | несколько языков |
| Дата открытия (изобретения) | 2 сентября 1992[1] |
| Размер данных | 8 b |
![]() | |
| Последнее обновление | ноябрь 2003 |
UTF-8 (от англ. Unicode Transformation Format, 8-bit — «формат преобразования Юникода, 8-бит») — распространённый стандарт кодирования символов, позволяющий более компактно хранить и передавать символы Юникода, используя переменное количество байт (от 1 до 4), и обеспечивающий полную обратную совместимость с 7-битной кодировкой ASCII. Стандарт UTF-8 официально закреплён в документах RFC 3629 и ISO/IEC 10646 Annex D.
Кодировка UTF-8 сейчас является доминирующей в веб-пространстве. Она также нашла широкое применение в UNIX-подобных операционных системах[2].
Формат UTF-8 был разработан 2 сентября 1992 года Кеном Томпсоном и Робом Пайком, и реализован в Plan 9[3]. Идентификатор кодировки в Windows — 65001[4].
UTF-8, по сравнению с UTF-16, наибольший выигрыш в компактности даёт для текстов на латинице, поскольку латинские буквы без диакритических знаков, цифры и наиболее распространённые знаки препинания кодируются в UTF-8 лишь одним байтом, и коды этих символов соответствуют их кодам в ASCII.[5][6]
Алгоритм кодирования
Алгоритм кодирования в UTF-8 стандартизирован в RFC 3629 и состоит из 3 этапов:
1. Определить количество октетов (байтов), требуемых для кодирования символа. Номер символа берётся из стандарта Юникода.
| Диапазон номеров символов | Требуемое количество октетов |
|---|---|
00000000-0000007F |
1 |
00000080-000007FF |
2 |
00000800-0000FFFF |
3 |
00010000-0010FFFF |
4 |
Для символов Юникода с номерами от U+0000 до U+007F (занимающими один байт c нулём в старшем бите) кодировка UTF-8 полностью соответствует 7-битной кодировке US-ASCII.
2. Установить старшие биты первого октета в соответствии с необходимым количеством октетов, определённом на первом этапе:
- 0xxxxxxx — если для кодирования потребуется один октет;
- 110xxxxx — если для кодирования потребуется два октета;
- 1110xxxx — если для кодирования потребуется три октета;
- 11110xxx — если для кодирования потребуется четыре октета.
Если для кодирования требуется больше одного октета, то в октетах 2-4 два старших бита всегда устанавливаются равными 102 (10xxxxxx). Это позволяет легко отличать первый октет в потоке, потому что его старшие биты никогда не равны 102.
| Количество октетов | Значащих бит | Шаблон |
|---|---|---|
| 1 | 7 | 0xxxxxxx |
| 2 | 11 | 110xxxxx 10xxxxxx |
| 3 | 16 | 1110xxxx 10xxxxxx 10xxxxxx |
| 4 | 21 | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
3. Установить значащие биты октетов в соответствии с номером символа Юникода, выраженном в двоичном виде. Начать заполнение с младших битов номера символа, поставив их в младшие биты последнего октета, продолжить справа налево до первого октета. Свободные биты первого октета, оставшиеся незадействованными, заполнить нулями.
Примеры кодирования
| Символ | Двоичный код символа | UTF-8 в двоичном виде | UTF-8 в шестнадцатеричном виде | |
|---|---|---|---|---|
| $ | U+0024 |
0100100 |
00100100 |
24 |
| ¢ | U+00A2 |
10100010 |
11000010 10100010 |
C2 A2 |
| € | U+20AC |
100000 10101100 |
11100010 10000010 10101100 |
E2 82 AC |
| 𐍈 | U+10348 |
1 00000011 01001000 |
11110000 10010000 10001101 10001000 |
F0 90 8D 88 |
Маркер UTF-8
Для указания, что файл или поток содержит символы Юникода, в начале файла или потока может быть вставлен маркер последовательности байтов (англ. Byte order mark, BOM), который в случае кодирования в UTF-8 принимает форму трёх байтов: EF BB BF16.
| 1-й байт | 2-й байт | 3-й байт | |
|---|---|---|---|
| Двоичный код | 1110 1111 | 1011 1011 | 1011 1111 |
| Шестнадцатеричный код | EF |
BB |
BF |
Пятый и шестой байты
Изначально кодировка UTF-8 допускала использование до шести байтов для кодирования одного символа, однако в ноябре 2003 года стандарт RFC 3629 запретил использование пятого и шестого байтов, а диапазон кодируемых символов был ограничен символом U+10FFFF. Это было сделано для обеспечения совместимости с UTF-16.
Возможные ошибки декодирования
Не всякая последовательность байтов является допустимой. Декодер UTF-8 должен понимать и адекватно обрабатывать такие ошибки:
- Недопустимый байт.
- Байт продолжения (10xxxxxx) без начального байта.
- Отсутствие нужного количества байтов продолжения 10xxxxxx — например, двух после 1110xxxx).
- Строка обрывается посреди символа.
- Неэкономное кодирование — например, кодирование символа тремя байтами, когда можно двумя. (Существует нестандартный вариант UTF-8, который кодирует символ с кодом 0 как 1100.0000 1000.0000, отличая его от символа конца строки 0000.0000.)
- Последовательность байтов, декодирующаяся в недопустимую кодовую позицию (например символы суррогатных пар UTF-16).
Примечания
- ↑ https://www.cl.cam.ac.uk/~mgk25/ucs/utf-8-history.txt
- ↑ Usage Statistics of Character Encodings for Websites, June 2011 (англ.)
- ↑ Архивированная копия. Дата обращения: 27 февраля 2007. Архивировано из оригинала 1 марта 2011 года. (англ.)
- ↑ Code Page Identifiers — Windows applications | Microsoft Docs. Дата обращения: 14 июля 2018. Архивировано 16 июня 2019 года.
- ↑ Well, I'm Back. String Theory (англ.). Robert O'Callahan (1 марта 2008). Дата обращения: 1 марта 2008. Архивировано 23 августа 2011 года.
- ↑ Ростислав Чебыкин. Всем кодировкам кодировка. UTF‑8: современно, грамотно, удобно. HTML и CSS. Дата обращения: 22 марта 2009. Архивировано 23 августа 2011 года.
Ссылки
- UTF-8 Стандарт кодирования
- UTF-8 encoding table and Unicode characters
- UTF-8: Кодирование и декодирование
- UTF-8, UTF-16, UTF-32 & BOM — Вопросы и ответы
- Compatibility Encoding Scheme for UTF-16: 8-Bit (CESU-8)
- Полное описание стандарта Unicode
- UTF-8 Everywhere Manifesto
- RFC-3629 «UTF-8, a transformation format of ISO 10646»
