Открыть сервис

UTF-8

UTF-8 (от англ. Unicode Transformation Format, 8-bit — формат преобразования Юникода, 8-битный) — это стандарт кодирования символов, использующий переменную длину кодового слова от 1 до 4 байт. UTF-8 является наиболее распространённой кодировкой в вебе, операционных системах и программном обеспечении, обеспечивая обратную совместимость с ASCII и возможность представления всех символов стандарта Юникод.

История

Разработка UTF-8 началась в 1992 году в компании Bell Labs. Авторами спецификации стали Кен Томпсон и Роб Пайк, которые стремились создать кодировку, совмещающую эффективность ASCII для латиницы с возможностью представления символов всех письменностей мира. Первая реализация была внедрена в операционной системе Plan 9.

В 1993 году стандарт был принят как часть спецификации Unicode (версия 2.0). В 2003 году UTF-8 был закреплён в стандарте RFC 3629, который определил максимальную длину кодовой последовательности в 4 байта (ранее допускались 5- и 6-байтовые последовательности, но они были исключены из-за проблем с безопасностью).

К началу 2010-х годов UTF-8 вытеснил другие кодировки (Windows-1251, KOI-8, ISO 8859-1) в веб-пространстве. По данным статистики W3Techs, на 2024 год более 98% всех веб-сайтов используют UTF-8.

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

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

Диапазон кодовых точек (шестнадцатеричный)Диапазон кодовых точек (десятичный)Формат байтовой последовательности
U+0000 — U+007F0 — 1270xxxxxxx
U+0080 — U+07FF128 — 2047110xxxxx 10xxxxxx
U+0800 — U+FFFF2048 — 655351110xxxx 10xxxxxx 10xxxxxx
U+10000 — U+10FFFF65536 — 111411111110xxx 10xxxxxx 10xxxxxx 10xxxxxx

Пояснение:

  • Байты, начинающиеся с бита «0», являются однобайтовыми кодами (совпадают с ASCII).
  • Байты, начинающиеся с «110», «1110» или «11110», указывают на начало двух-, трёх- или четырёхбайтовой последовательности соответственно.
  • Все последующие байты в последовательности начинаются с «10».
  • Оставшиеся биты (обозначенные как «x») содержат биты кодовой точки.

Примеры кодирования

  • Символ «A» (U+0041) — кодируется одним байтом: 0x41 (01000001).
  • Символ «Ё» (U+0401) — кодируется двумя байтами: 0xD0 0x81 (11010000 10000001).
  • Символ «€» (U+20AC) — кодируется тремя байтами: 0xE2 0x82 0xAC (11100010 10000010 10101100).
  • Символ «𝄞» (U+1D11E) — кодируется четырьмя байтами: 0xF0 0x9D 0x84 0x9E.

Преимущества

  1. Обратная совместимость с ASCII: все символы ASCII (коды 0–127) кодируются одним байтом, что позволяет корректно обрабатывать UTF-8 в старых системах, работающих только с ASCII.
  2. Эффективность: для текстов на латинице (английский, немецкий, французский) UTF-8 занимает столько же места, сколько ASCII. Для кириллицы, арабского, иврита — два байта на символ (в отличие от UTF-16, где для базовых символов требуется два байта).
  3. Отсутствие проблем с порядком байтов: UTF-8 не зависит от архитектуры процессора (big-endian / little-endian), в отличие от UTF-16 и UTF-32, для которых требуется BOM (Byte Order Mark).
  4. Самосинхронизация: при потере одного байта в последовательности возможно восстановление синхронизации, так как каждый байт имеет маркер начала последовательности.
  5. Поддержка всех символов Юникода: UTF-8 может кодировать все 1 114 112 кодовых точек Unicode (от U+0000 до U+10FFFF).

Недостатки

  1. Переменная длина: для символов с кодами выше U+07FF требуется три или четыре байта, что увеличивает объём данных для текстов на китайском, японском, корейском языках (CJK) по сравнению с двухбайтовыми кодировками (например, GB 18030 или Shift JIS).
  2. Сложность обработки: для программ, работающих с отдельными символами, требуется декодирование последовательностей, что может быть медленнее, чем работа с фиксированной длиной (как в UTF-32).
  3. Неэффективность для коротких строк: для текстов, содержащих много символов с кодами выше U+07FF, UTF-8 может занимать больше места, чем UTF-16.

Применение

Веб-технологии

UTF-8 является стандартной кодировкой для HTML5, XML, JSON, а также для большинства протоколов передачи данных (HTTP, SMTP, FTP). По состоянию на 2024 год более 98% веб-сайтов используют UTF-8.

Операционные системы

  • Linux и macOS: системные утилиты, файловые системы и терминалы по умолчанию используют UTF-8.
  • Windows: начиная с Windows 10 (версия 1903), Microsoft рекомендует использовать UTF-8 для кодировки текстовых файлов и системных строк.

Программирование

  • Языки программирования (Python, Java, C#, JavaScript, Go) поддерживают UTF-8 как встроенную кодировку для строк.
  • Библиотеки и фреймворки (например, ICU, iconv) обеспечивают преобразование между UTF-8 и другими кодировками.

Базы данных

Большинство современных СУБД (MySQL, PostgreSQL, SQLite) поддерживают UTF-8 в качестве кодировки для хранения текстовых данных.

Сравнение с другими кодировками

ХарактеристикаUTF-8UTF-16UTF-32ASCII
Длина кодового слова1–4 байта2 или 4 байта4 байта1 байт
Поддержка ЮникодаДаДаДаНет
Совместимость с ASCIIПолнаяНетНетПолная
Размер для латиницы1 байт/символ2 байта/символ4 байта/символ1 байт/символ
Размер для кириллицы2 байта/символ2 байта/символ4 байта/символНе поддерживается
Зависимость от порядка байтовНетДа (BOM)Да (BOM)Нет

Интересные факты

  • UTF-8 был разработан за один вечер в 1992 году Кеном Томпсоном на салфетке в ресторане в Нью-Джерси.
  • В 2003 году из стандарта были исключены 5- и 6-байтовые последовательности (до U+7FFFFFFF), так как они не соответствовали ограничениям Unicode и создавали уязвимости безопасности (например, возможность переполнения буфера).
  • UTF-8 является единственной кодировкой, поддерживаемой протоколом HTTP/2 и HTTP/3.
  • В 2019 году UTF-8 был признан стандартом ISO/IEC 10646 (Universal Coded Character Set).

Источники

  • RFC 3629 — UTF-8, a transformation format of ISO 10646 (2003)
  • The Unicode Standard, Version 15.0 (2022)
  • W3Techs — Usage Statistics of Character Encodings for Websites (2024)
  • Кен Томпсон, Роб Пайк — «UTF-8 history» (1993)
  • ISO/IEC 10646:2020 — Information technology — Universal Coded Character Set (UCS)

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →