UTF-8

UTF-8 (от англ. Unicode Transformation Format, 8-bit — «формат преобразования Юниа, 8-бит») — распространённый стандарт ирования символов, позволяющий более компактно хранить и передавать символы Юниа, используя переменное количество байт (от 1 до 4), и обеспечивающий полную обратную совместимость с 7-битной ировкой ASCII. Стандарт UTF-8 официально закреплён в документах RFC 3629 и ISO/IEC 10646 Annex D.

ировка UTF-8 сейчас является доминирующей в веб-пространстве. Она также нашла широкое применение в UNIX-подобных операционных системах[1].

Формат UTF-8 был разработан 2 сентября 1992 года Кеном Томпсоном и Робом Пайком, и реализован в Plan 9[2]. Идентификатор ировки в Windows — 65001[3].

UTF-8, по сравнению с UTF-16, наибольший выигрыш в компактности даёт для текстов на латинице, поскольку латинские буквы без диакритических знаков, цифры и наиболее распространённые знаки препинания ируются в UTF-8 лишь одним байтом, и ы этих символов соответствуют их ам в ASCII.[4][5]


Алгоритм ирования[ | ]

Алгоритм ирования в 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).

Примечания[ | ]

  1. Usage Statistics of Character Encodings for Websites, June 2011 (англ.)
  2. Архивированная копия (недоступная ссылка). Дата обращения: 27 февраля 2007. Архивировано 1 марта 2011 года. (англ.)
  3. Code Page Identifiers — Windows applications | Microsoft Docs
  4. Well, I'm Back. String Theory (англ.). Robert O'Callahan (1 March 2008). Дата обращения: 1 марта 2008. Архивировано 23 августа 2011 года.
  5. Ростислав Чебыкин. Всем ировкам ировка. UTF‑8: современно, грамотно, удобно.. HTML и CSS. Дата обращения: 22 марта 2009. Архивировано 23 августа 2011 года.

Ссылки[ | ]