UTF-8 — кодировка Юникода¶
UTF-8 — это переменная по длине многобайтовая кодировка символов, используемая для представления текстов в стандарте Юникод. Она способна закодировать любой символ из основных плоскостей Юникода — от латиницы и кириллицы до иероглифов, эмодзи и исторических письменностей. UTF-8 является преобладающим стандартом кодировки в интернете: по данным различных исследований, более 98 % всех веб-страниц используют именно её. UTF-8 является стандартом ISO/IEC 10646 и совместим с ASCII: первые 128 символов кодируются теми же однобайтовыми значениями, что и в ASCII.
¶История создания
UTF-8 был разработан в 1992 году Кеном Томпсоном и Робом Пайком, сотрудниками Bell Labs. По распространённой истории, идея пришла во время ужина в ресторане в Нью-Йорке: Томпсон и Пайк обсуждали проблему совместимости существующих систем с Юникодом и пришли к решению использовать структуру, похожую на кодировку UTF-6, предложенную Моррисом и Томпсоном ещё в 1992 году. Результат — схема, в которой многобайтовые последовательности используют байты со старшими битами 10xxxxxx в качестве байтов-продолжений, а ведущие байты содержат информацию о длине последовательности.
Первоначально кодировка называся «UTF-2» (потому что использовал минимум два байта), но позже была переименована в UTF-8. В 2003 году UTF-8 был формально стандартизирован в качестве стандарта Unicode (версия 3.2), а позже вошёл в состав ISO/IEC 10646.
¶Принцип кодирования
UTF-8 кодирует символы Юникода в последовательности от одного до четырёх байтов. Длина последовательности определяется диапазоном кодовой точки:
| Диапазон кодовых точек | Кол-во байтов | Структура |
|---|---|---|
| U+0000 — U+007F | 1 | 0xxxxxxx |
| U+0080 — U+07FF | 2 | 110xxxxx 10xxxxxx |
| U+0800 — U+FFFF | 3 | 1110xxxx 10xxxxxx 10xxxxxx |
| U+10000 — U+10FFFF | 4 | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
Ведущий байт последовательности начинается с единиц (столько единиц, сколько байтов в последовательности), затем идёт ноль и старшие биты кодовой точки. Все последующие байты-продолжения начинаются с битов 10. Такая схема позволяет однозначно определить границы символов в потоке байтов и делать поиск по подстроке без полного декодирования текста.
Благодаря совместимости с ASCII тексты, состоящие только из латиницы, кодируются идентично. Кириллица (U+0400—U+04FF) занимает два байта на символ, а большинство иероглифов — три.
¶Свойства и преимущества
Ключевые свойства UTF-8:
- Самосинхронизируемость — повреждение одного байта не приводит к сбою последующих символов, поскольку границы символов можно определить по ведущим байтам.
- Отсутствие байтового порядка — в отличие от UTF-16 и UTF-32, UTF-8 не зависит от порядка байтов (endianness), что упрощает обмен данными между разными платформами.
- Оптимальность для латиницы — англоязычные тексты занимают столько же места, сколько в ASCII.
- Обратная совместимость — корректные ASCII-файлы являются одновременно корректными UTF-8-файлами.
К основенным недостаткам относится увеличение объёма кириллических текстов вдвое по сравнению с однобайтовыми кодировками (например, Windows-1251) и в 1,5 раза по сравнению с UTF-16. Иероглифические тексты в UTF-8 занимают три байта на символ против двух в UTF-16.
¶Применение
UTF-8 является стандартом де-факто для текстовых данных в интернете, операционных системах и языках программирования. Веб-страницы, не указывающие кодировку явно, по стандарту HTML5 интерпретируются как UTF-8. Большинство современных баз данных (PostgreSQL, MySQL, MongoDB) по умолчанию используют UTF-8 для хранения текста.
В Linux и macOS файловая система и утилиты ориентированы на UTF-8; в Windows поддержка UTF-8 как системной кодировки стала доступна начиная с Windows 10 (опция «Beta: Use Unicode UTF-8 for worldwide language support»). Языки программирования, такие как Python 3, Go, Rust и JavaScript, используют UTF-8 для внутреннего представления строк либо требуют его при вводе-выводе.
¶UTF-8 и русский язык
Для русскоязычного интернета переход на UTF-8 завершился в 2000-х годах. Ранее использовались кодировки KOI8-R, Windows-1251 и ISO-8859-5. В UTF-8 русские буквы кодируются двумя байтами: например, буква «А» (U+0410) представляется последовательностью 0xD0 0x90. Некорректное отображение русского текста, известное как «кракозябры», чаще всего возникает при чтении UTF-8-файла в одной из этих однобайтовых кодировок или наоборот.
¶Источники
- The Unicode Consortium. The Unicode Standard
- RFC 3629 — UTF-8, a transformation format of ISO 10646
- W3C. Character Encoding — Web Accessibility Initiative
- Пайк Р., Томпсон К. UTF-8 design history
