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

Для указания, что файл или поток содержит символы Юникода, в начале файла или потока может быть вставленмаркер последовательности байтов(англ.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).
  1. https://www.cl.cam.ac.uk/~mgk25/ucs/utf-8-history.txt
  2. Usage Statistics of Character Encodings for Websites, June 2011(англ.)
  3. Архивированная копия.Дата обращения: 27 февраля 2007. Архивировано изоригинала1 марта 2011 года.(англ.)
  4. Code Page Identifiers — Windows applications | Microsoft Docs.Дата обращения: 14 июля 2018.Архивировано16 июня 2019 года.
  5. Well, I'm Back.String Theory(англ.).Robert O'Callahan(1 марта 2008). Дата обращения: 1 марта 2008.Архивировано23 августа 2011 года.
  6. Ростислав Чебыкин.Всем кодировкам кодировка. UTF‑8: современно, грамотно, удобно.HTML и CSS.Дата обращения: 22 марта 2009.Архивировано23 августа 2011 года.