Конвертер кодировок текста

Кодировка UTF-8: универсальный стандарт представления текста

Перекодировать текст из UTF-8 ↓

UTF-8 представляет собой самую распространённую в мире кодировку текста. Её название расшифровывается как Unicode Transformation Format, 8-bit, то есть "формат преобразования Юникода, восьмибитный". Сегодня в UTF-8 работает подавляющее большинство сайтов, она используется по умолчанию в современных операционных системах, языках программирования, текстовых редакторах и базах данных. Фактически именно эта кодировка положила конец многолетней путанице, когда один и тот же файл по-разному выглядел на разных компьютерах.

Чтобы понять значение UTF-8, нужно вспомнить, что было до неё. Первым массовым стандартом стала семибитная таблица ASCII, в которой помещалось всего 128 символов: латинские буквы, цифры, знаки препинания и управляющие коды. Для английского языка этого хватало, но для остальных письменностей места не оставалось. Решением стали восьмибитные кодировки, в которых первая половина таблицы повторяла ASCII, а вторая отдавалась национальному алфавиту. Так появились ISO-8859-1 и Windows-1252 для западноевропейских языков, а для кириллицы сразу несколько несовместимых вариантов: Windows-1251, KOI8-R, CP866 и ISO-8859-5.

У такого подхода было два серьёзных недостатка. Во-первых, в одном документе нельзя было совместить, например, русский, греческий и французский текст, поскольку каждая таблица вмещала лишь один дополнительный алфавит. Во-вторых, файл не содержал сведений о том, в какой кодировке он записан, и программа должна была угадывать её сама. При ошибке вместо слов появлялись так называемые "кракозябры". Для языков с иероглифической письменностью положение было ещё сложнее: там применялись многобайтовые схемы вроде Shift_JIS, Big5 и GB2312, каждая со своими правилами.

Ответом на эти трудности стал Юникод, единый каталог, в котором каждому символу любой письменности присвоен уникальный номер, называемый кодовой позицией. Однако сам Юникод лишь нумерует символы и не определяет, как записывать эти номера в виде байтов. Первые способы записи, UCS-2 и пришедшая ему на смену UTF-16, отводили на символ по два байта и были несовместимы с ASCII: в обычном английском тексте каждый второй байт оказывался нулевым, что ломало огромное количество существующих программ. Кодировка UTF-32 с четырьмя байтами на символ оказалась ещё более расточительной.

UTF-8 была придумана в 1992 году Кеном Томпсоном и Робом Пайком и впервые реализована в операционной системе Plan 9. Её главная идея заключается в переменной длине: символ занимает от одного до четырёх байтов в зависимости от своего номера в Юникоде. Символы ASCII записываются одним байтом и выглядят точно так же, как в исходной таблице, поэтому любой текст в ASCII одновременно является корректным текстом в UTF-8. Буквы кириллицы, греческого, иврита и арабского занимают по два байта, большинство иероглифов китайского, японского и корейского языков требуют трёх, а редкие знаки и эмодзи записываются четырьмя байтами.

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

Разумеется, у UTF-8 есть и свои особенности. Русский текст в ней занимает примерно вдвое больше места, чем в Windows-1251 или KOI8-R, а текст на китайском или японском оказывается объёмнее, чем в UTF-16. Из-за переменной длины нельзя мгновенно перейти к символу с заданным номером: число байтов в строке не совпадает с числом знаков, и программисту приходится помнить об этом при обрезке и подсчёте длины строк. Тем не менее при современных объёмах памяти и скоростях передачи данных эти неудобства несопоставимы с выгодой от единого стандарта.

На практике ошибки, связанные с UTF-8, чаще всего возникают на стыке со старыми кодировками. Если текст в UTF-8 открыть как Windows-1251, слово "Привет" превратится в "Привет", и характерное чередование букв "Р" и "С" сразу выдаёт причину. Обратная ошибка, когда файл в Windows-1251 читают как UTF-8, приводит к появлению знаков замены в виде ромбов с вопросом, поскольку байты старой кодировки не образуют допустимых последовательностей. Отдельного внимания заслуживает MySQL, где кодировка под названием "utf8" исторически хранит не более трёх байтов на символ, а для полноценной поддержки, включая эмодзи, требуется вариант "utf8mb4".

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

Частые вопросы

Почему UTF-8 открывается кракозябрами «РџСЂРёРІРµС‚»?
Программа считает файл записанным в Windows-1251. Каждая русская буква в UTF-8 занимает два байта, и программа показывает их как два символа. Вставьте текст в конвертер или откройте файл с явным выбором UTF-8. Подробнее — на странице UTF-8 → Windows-1251.
Что такое UTF-8 с BOM?
Это UTF-8 с тремя служебными байтами EF BB BF в начале файла, по которым программы узнают кодировку. BOM нужен для CSV-файлов, открываемых в Excel, и мешает в PHP-скриптах и конфигурационных файлах.