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+007F | 0 — 127 | 0xxxxxxx |
| U+0080 — U+07FF | 128 — 2047 | 110xxxxx 10xxxxxx |
| U+0800 — U+FFFF | 2048 — 65535 | 1110xxxx 10xxxxxx 10xxxxxx |
| U+10000 — U+10FFFF | 65536 — 1114111 | 11110xxx 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.
Преимущества
- Обратная совместимость с ASCII: все символы ASCII (коды 0–127) кодируются одним байтом, что позволяет корректно обрабатывать UTF-8 в старых системах, работающих только с ASCII.
- Эффективность: для текстов на латинице (английский, немецкий, французский) UTF-8 занимает столько же места, сколько ASCII. Для кириллицы, арабского, иврита — два байта на символ (в отличие от UTF-16, где для базовых символов требуется два байта).
- Отсутствие проблем с порядком байтов: UTF-8 не зависит от архитектуры процессора (big-endian / little-endian), в отличие от UTF-16 и UTF-32, для которых требуется BOM (Byte Order Mark).
- Самосинхронизация: при потере одного байта в последовательности возможно восстановление синхронизации, так как каждый байт имеет маркер начала последовательности.
- Поддержка всех символов Юникода: UTF-8 может кодировать все 1 114 112 кодовых точек Unicode (от U+0000 до U+10FFFF).
Недостатки
- Переменная длина: для символов с кодами выше U+07FF требуется три или четыре байта, что увеличивает объём данных для текстов на китайском, японском, корейском языках (CJK) по сравнению с двухбайтовыми кодировками (например, GB 18030 или Shift JIS).
- Сложность обработки: для программ, работающих с отдельными символами, требуется декодирование последовательностей, что может быть медленнее, чем работа с фиксированной длиной (как в UTF-32).
- Неэффективность для коротких строк: для текстов, содержащих много символов с кодами выше 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-8 | UTF-16 | UTF-32 | ASCII |
|---|---|---|---|---|
| Длина кодового слова | 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 →