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. Установить старшие биты первого октета в соответствии с необходимым количеством октетов, определённом на первом этапе:
Если для кодирования требуется больше одного октета, то в октетах 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
|
Для указания, что файл или поток содержит символы Юникода, в начале файла или потока может быть вставлен маркер последовательности байтов (англ. 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 должен понимать и адекватно обрабатывать такие ошибки:
Исторические кодировки | |
---|---|
современное 8-битное представление | |
Многобайтные | |
Форматы cериализационных цифровых данных | |
---|---|
Текстовые | |
Интернет и телекоммуникации | |
Медиа | |
Другие |