UTF-8

UTF-8

UTF-8 (от англ. Unicode Transformation Format, 8-bit — «формат преобразования Юникода, 8-битный») — распространённая кодировка символов Юникода, совместимая с 8-битными форматами передачи текста. Нашла широкое применение в операционных системах и веб-пространстве[1].

В отличие от UTF-16, UTF-8 является самосинхронизирующейся кодировкой (англ.): при потере одного байта последующие байты будут раскодированы корректно.

Текст, состоящий только из символов Юникода с номерами меньше 128, при записи в UTF-8 превращается в обычный текст ASCII. И наоборот, в тексте UTF-8 любой байт со значением меньше 128 изображает символ ASCII с тем же кодом. Остальные символы Юникода изображаются последовательностями длиной от 2 до 6 байт (реально только до 4 байт, поскольку использование кодов больше 221 не планируется), в которых первый байт всегда имеет вид 11xxxxxx, а остальные — 10xxxxxx.

Проще говоря, в формате UTF-8 символы латинского алфавита, знаки препинания и управляющие символы ASCII записываются кодами US-ASCII, a все остальные символы кодируются при помощи нескольких байтов со старшим битом 1. Это приводит к двум эффектам.

  • Даже если программа не распознаёт Юникод, то латинские буквы, арабские цифры и знаки препинания будут отображаться правильно.
  • В случае, если латинские буквы и простейшие знаки препинания (включая пробел) занимают существенный объём текста, UTF-8 даёт выигрыш по объёму по сравнению с UTF-16.[2][3]

На первый взгляд может показаться, что UTF-16 удобнее, так как в ней большинство символов кодируется ровно двумя байтами.

Однако это сводится на нет необходимостью поддержки суррогатных пар, о которых часто забывают при использовании UTF-16, реализуя лишь поддержку символов UCS-2.[2]

Формат UTF-8 был изобретён 2 сентября 1992 года Кеном Томпсоном и Робом Пайком и реализован в Plan 9.[4] Сейчас стандарт UTF-8 официально закреплён в документах RFC 3629 и ISO/IEC 10646 Annex D.

Замечание: Символы, закодированные в UTF-8, могут быть длиной до шести байт, однако стандарт Unicode не определяет символов выше 0x10ffff, поэтому символы Unicode могут иметь максимальный размер в 4 байта в UTF-8.

Содержание

Принцип кодирования

Текстовое описание

В UTF-8 можно кодировать значения кодов символов от 0 до 7FFFFFFF16 включительно (все комбинации 32-битных без установленного старшего бита).

Каждый символ кодируется переменным количеством последовательных 8-битных байт (октетов). Количество же может варьироваться от 1 до 6 байт включительно и определяется самым первым байтом.

Все ASCII-символы (от 0 до 127 (000000002 — 011111112 или 0016 — 7F16) включительно) записываются как есть одним байтом со сброшенным старшим битом.

Все остальные символы кодируются уже особым образом и далее текст этого раздела касается только их. Чтобы лучше понять принцип, лучше представляйте себе блоки бит с их позицией.

У байт не ASCII-символов старший бит всегда установлен в 1. При этом второй с конца бит всегда сброшен у не первых байт (у первых, соответственно, установлен). Поэтому если чтение производится с произвольного байта, то по второму биту можно определять промежуточные байты.

И у не первых байт остальные 6 младших бит содержат фрагмент кода символа (об этом ниже).

Количество байт, которое отводится под символ, всегда равно количеству идущих подряд старших бит со значением 1 в первом байте. Эти биты всегда завершаются битом со значением 0. Оставшиеся младшие биты первого байта составляют код символа. Отсюда обуславливается ограничение в 6 байт на символ — если выше, то в первом байте уже не хватит места под биты данных. Поэтому последовательности бит 111111102 (FE16) и 111111112 (FF16) общепринято считаются не используемыми в UTF-8.

До этого описывалась структура, а теперь про расположение данных.

Как видно из описания выше, каждый байт имеет определённое количество младших бит под данные — переменное у первого и по 6 в последующих. 32-битный код символа последовательно размещается в этих контейнерах. Старшие биты оказываются в первых байтах, а младшие — в последних. Поэтому младшие 6 бит последнего байта всегда содержат биты 0..5 кода символа. Аналогично, предпоследний байт содержат биты 6..11, третий с конца — 12..17, четвёртый — 18..23, пятый — 24..29. Первый байт же содержит оставшиеся старшие биты значения.

Зная структуру и расположение данных внутри байт, теперь рассмотрим взаимосвязь кода символа и количества байт.

Каждое количество байт способно хранить конкретный диапазон значений кода символа. При этом сами диапазоны значений расположены плотно по порядку без всяких просветов. Проиллюстрируем это соответствующей таблицей:

Коды символов Unicode (HEX) Размер в UTF-8 Представленные классы символов
00000000 — 0000007F 1 байт ASCII, в том числе латинский алфавит, простейшие знаки препинания и арабские цифры
00000080 — 000007FF 2 байта кириллица, расширенная латиница, арабский, армянский, греческий, еврейский и коптский алфавит; сирийское письмо, тана, нко; МФА; некоторые знаки препинания
00000800 — 0000FFFF 3 байта все другие современные формы письменности, в том числе грузинский алфавит, индийское, китайское, корейское и японское письмо; сложные знаки препинания; математические и другие специальные символы
00010000 — 001FFFFF 4 байта музыкальные символы, редкие китайские иероглифы, вымершие формы письменности
00200000 — 03FFFFFF 5 байт не используется в Unicode
04000000 — 7FFFFFFF 6 байт не используется в Unicode

Следует отметить, что данная таблица подразумевает плотное кодирование и поэтому она представляет только идеальные комбинации.

Кодировка UTF-8 не является однозначной, так как в ней учитывается размер бит значения без учёта позиции последнего установленного бита. Поэтому возможно написание «грубого» кодировщика, который не отбрасывает лидирующие нули. Например, ASCII-символ «1» (код 001100012 (3116)), может быть представлен следующими двухбайтовыми и трёхбайтовыми последовательностями: 110000002 101100012 (C016 B116) и 111000002 100000002 101100012 (E016 8016 B116). Отсюда выходят следующие бессмыленные битовые комбинации первых байт: 110000002 (C016), 111000002 (E016), 111100002 (F016), 111110002 (F816), 111111002 (FC16), а также последующие за ними комбинации промежуточных байт 100000002 (8016).

Графическое представление

Кодировка UTF-8 использует значения конкретных битов и учитывает расположение битовых блоков. Поэтому она может быть полноценно проиллюстрирована очевидным графическим образом. Если вам требуется быстро реализовать кодирование и раскодирование, то можете воспользоваться следующей схемой:

UTF-8 Encoding Scheme.png

Максимальный потенциал

До этого рассматривалось кодирование в UTF-8 лишь 32-битных целых без отрицательных значений. Следует отметить, что в стандарте Unicode используются символы лишь до кода 001FFFFF16 включительно. Поэтому даже 32-битных значений может вполне хватить, но этот раздел был включён для полноты изложения в случае использования UTF-8 для кодирования несимвольных данных.

В первом байте количество установленных старших бит определяет количество байт на символ. Оставшиеся младшие биты хранят старшие биты значения кода символа. Мы можем сделать допущение о том, что первый байт не обязан содержать данные. При этом допускаем, что все биты за пределами байта равны нулю. Тогда данные будут содержать только 6 бит в последующих байтах. Получается 36 бит для семибайтового символа и 42 бита — для восьмибайтового.

Неиспользуемые значения байтов

В тексте UTF-8 принципиально не может быть байтов со значениями 254 (FE16) и 255 (FF16). Поскольку в Юникоде не определены символы с кодами выше 221, то в UTF-8 оказываются неиспользуемыми также значения байтов от 248 до 253 (F816 — FD16). Если запрещены искусственно удлинённые (за счёт добавления ведущих нулей) последовательности UTF-8, то не используются также байтовые значения 192 и 193 (C016 и C116).

BOM (сигнатура)

См. так же полную статью «Byte order mark».

Многие программы Windows (включая Блокнот) добавляют байты EF16, BB16, BF16 в начале любого документа, сохраняемого как UTF-8. Это метка порядка байтов (англ. Byte Order Mark, BOM), также её часто называют сигнатурой (соответственно, UTF-8 и UTF-8 with Signature). По наличию сигнатуры программы могут автоматически определить, является ли файл закодированным в UTF-8, однако файлы с такой сигнатурой могут некорректно обрабатываться старыми программами, в частности xml-анализаторами. Такие редакторы, как Notepad++, Notepad2 и Kate, позволяют явно указывать, следует ли добавлять сигнатуру при сохранении UTF-файлов.

Например: В файле записана одна латинская буква «a».

  • Если кодировка этого файла UTF-8 with Signature, то он будет содержать: EF16 BB16 BF16 6116
  • Если кодировка этого файла UTF-8 (без сигнатуры), то он будет содержать: 6116

Если считывающая программа не поддерживает BOM, то эти три байта успешно раскодируются в один Unicode-символ FEFF16. Это не разрывающий слова пробел нулевой ширины и поэтому он может не отобразиться. Этот же символ используется в BOM для кодировок UTF-16 и UTF-32.

См. также

Примечания

  1. Usage Statistics of Character Encodings for Websites, June 2011  (англ.)
  2. 1 2 Well, I'm Back String Theory  (англ.). Robert O'Callahan (1 March 2008). Архивировано из первоисточника 23 августа 2011. Проверено 1 марта 2008.
  3. Ростислав Чебыкин Всем кодировкам кодировка. UTF‑8: современно, грамотно, удобно.. HTML и CSS. Архивировано из первоисточника 23 августа 2011. Проверено 22 марта 2009.
  4. http://www.cl.cam.ac.uk/~mgk25/ucs/utf-8-history.txt  (англ.)

Ссылки

Кодировки символов
Основы → алфавиттекстфайлданные ) • набор символов • конверсия
Исторические кодировки → Докомп.: семафорная (Макарова)МорзеБодоМТК-2 Комп.: 6 битУППRADIX-50EBCDICДКОИ-8 ) • КОИ-7ISO 646
совре-
менное
8-битное
представ-
ление
символы ASCIIуправляющиепечатные ) не-ASCII ( псевдографика )
8бит. код.стр. Разные →   Кириллица: КОИ-8ГОСТ 19768-87MacCyrillic
ISO 8859 → 1(лат.) 2 3 4 5(кир.) 6 7 8 9 10 11 12 13 14 15(€) 16
Windows → 1250 1251(кир.) 1252 1253 1254 1255 1256 1257 1258 | WGL4
IBM&DOS → 437850852855866 «альт.» • ( МИК ) • ( НИИ ЭВМ )
Много-
байтные
Традиционные → DBCSGB2312 ) • HTML
Unicode → UTF-16UTF-8список символовкириллица )
Связанные
темы →
интерфейс пользователяраскладка клавиатурылокальперевод строкишрифткракозябрытранслитнестандартные шрифты • текст как изображение Утилиты: iconvrecode

Wikimedia Foundation. 2010.

Игры ⚽ Нужно решить контрольную?

Полезное


Смотреть что такое "UTF-8" в других словарях:

  • UTF-8 — (8 bit Unicode Transformation Format) es un formato de codificación de caracteres Unicode e ISO 10646 utilizando símbolos de longitud variable. UTF 8 fue creado por Robert C. Pike y Kenneth L. Thompson. Está definido como estándar por la RFC 3629 …   Wikipedia Español

  • UTF-7 — (7 bit Unicode Transformation Format) is a variable length character encoding that was proposed for representing Unicode text using a stream of ASCII characters. It was originally intended to provide a means of encoding Unicode text for use in… …   Wikipedia

  • UTF-8 — (Abk. für 8 bit UCS Transformation Format wobei UCS wiederum Universal Character Set abkürzt) ist die am weitesten verbreitete Kodierung für Unicode Zeichen (Unicode und UCS sind praktisch identisch). Die Kodierung wurde im September 1992 von Ken …   Deutsch Wikipedia

  • UTF-7 — (7 bit Unicode Transformation Format) es una codificación de caracteres de longitud variable que fue propuesta para representar texto codificado con Unicode usando un flujo de caracteres ASCII, para ser usado, por ejemplo en mensajes de correo… …   Wikipedia Español

  • UTF-8 — (UCS Transformation Format  8 bit[1]) is a multibyte character encoding for Unicode. Like UTF 16 and UTF 32, UTF 8 can represent every character in the Unicode character set. Unlike them, it is backward compatible with ASCII and avoids the… …   Wikipedia

  • UTF-16 — (англ. Unicode Transformation Format) в информатике один из способов кодирования символов из Unicode в виде последовательности 16 битных слов. Данная кодировка позволяет записывать символы Юникода в диапазонах U+0000..U+D7FF и… …   Википедия

  • UTF-16 — est un codage des caractères définis par Unicode où chaque caractère est codé sur une suite de un ou deux mots de 16 bits. Le codage était défini dans le rapport technique 17 à la norme Unicode. Depuis, cette annexe est devenue obsolète car UTF… …   Wikipédia en Français

  • Utf-16 — Unicode Jeux de caractères UCS (ISO/CEI 10646) ISO 646, ASCII ISO 8859 1 WGL4 UniHan Équivalences normalisées NFC (précomposée) NFD (décomposée) NFKC (compatibilité) NFKD (compatibilité) Propriétés et algorithmes ISO 15924 …   Wikipédia en Français

  • Utf-8 — (от англ. Unicode Transformation Format формат преобразования Юникода) в настоящее время распространённая кодировка, реализующая представление Юникода, совместимое с 8 битным кодированием текста. Текст, состоящий только из символов с номером… …   Википедия

  • UTF-8 — (UCS transformation format 8 bits) est un format de codage de caractères. Chaque caractère ou graphème est représenté dans le répertoire du jeu universel de caractères sous la forme d’une suite d’un ou plusieurs « caractères abstraits » …   Wikipédia en Français


Поделиться ссылкой на выделенное

Прямая ссылка:
Нажмите правой клавишей мыши и выберите «Копировать ссылку»