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
|
1100001010100010
|
C2A2
|
€ | U+20AC
|
10000010101100
|
111000101000001010101100
|
E282AC
|
𐍈 | U+10348
|
1 00000011 01001000
|
11110000100100001000110110001000
|
F0908D88
|
Маркер 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 года.