UTF-8
UTF-8 (от англ. Unicode Transformation Format в формат преобразования Юникода) в в настоящее время распространённая кодировка, реализующая представление Юникода, совместимое с 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 следующим образом:
| Unicode | UTF-8 | Представленные символы |
|---|---|---|
0x00000000 в 0x0000007F |
0xxxxxxx |
ASCII, в том числе латинский алфавит, простейшие знаки препинания и арабские цифры |
0x00000080 в 0x000007FF |
110xxxxx 10xxxxxx |
кириллица, расширенная латиница, арабский, армянский, греческий, еврейский и коптский алфавит; сирийское письмо, тана, нко; МФА; некоторые знаки препинания |
0x00000800 в 0x0000FFFF |
1110xxxx 10xxxxxx 10xxxxxx |
все другие современные формы письменности, в том числе грузинский алфавит, индийское, китайское, корейское и японское письмо; сложные знаки препинания; математические и другие специальные символы |
0x00010000 в 0x001FFFFF |
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
музыкальные символы, редкие китайские иероглифы, вымершие формы письменности |
Также теоретически возможны, но не включены в стандарты:
| Unicode | UTF-8 |
|---|---|
0x00200000 в 0x03FFFFFF |
111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx |
0x04000000 в 0x7FFFFFFF |
1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx |
Замечание: Символы, закодированные в UTF-8, могут быть длиной до шести байт, однако стандарт Unicode не определяет символов выше 0x10ffff, поэтому символы Unicode могут иметь максимальный размер в 4 байта в UTF-8.
Содержание |
[править] Неиспользуемые значения байтов
В тексте UTF-8 принципиально не может быть байтов со значениями 254 (0xFE) и 255 (0xFF). Поскольку в Юникоде не определены символы с кодами выше 221, то в UTF-8 оказываются неиспользуемыми также значения байтов от 248 до 253 (0xF8в0xFD). Если запрещены искусственно удлинённые (за счёт добавления ведущих нулей) последовательности UTF-8, то не используются также байтовые значения 192 и 193 (0xC0 и 0xC1).
[править] Порядок байтов (BOM, сигнатура)
Многие программы Windows (включая Блокнот) добавляют байты 0xEF, 0xBB, 0xBF в начале любого документа, сохраняемого как UTF-8. Это метка порядка байтов Юникода (англ. Byte Order Mark, BOM), также её часто называют сигнатурой (соответственно, UTF-8 и UTF-8 with Signature). По наличию сигнатуры программы могут автоматически определить, является ли файл закодированным в UTF-8, однако файлы с такой сигнатурой могут некорректно обрабатываться старыми программами, в частности xml-анализаторами. Такие редакторы, как Notepad++, Notepad2 и Kate, позволяют явно указывать, следует ли добавлять сигнатуру при сохранении UTF-файлов.
Например: В файле записана одна латинская буква "a".
- Если кодировка этого файла UTF-8 with Signature, то он будет содержать: EF BB BF 61
- Если кодировка этого файла UTF-8 (без сигнатуры), то он будет содержать: 61
[править] См. также
[править] Примечания
- в‘ Usage Statistics of Character Encodings for Websites, June 2011 (англ.)
- в‘ 1 2 Well, I'm Back String Theory (англ.). Robert O'Callahan (1 March 2008). Архивировано из первоисточника 23 августа 2011. Проверено 1 марта 2008.
- в‘ Ростислав Чебыкин Всем кодировкам кодировка. UTFв‘8: современно, грамотно, удобно.. HTML и CSS. Архивировано из первоисточника 23 августа 2011. Проверено 22 марта 2009.
- в‘ http://www.cl.cam.ac.uk/~mgk25/ucs/utf-8-history.txt (англ.)

