Текст в двоичный код: как строка выглядит на уровне байтов
Что делает эта конвертация
Инструмент кодирует текст в байты по стандарту UTF-8, а затем записывает каждый байт восемью двоичными цифрами. Арифметики здесь нет: символ ищется в таблице кодировки и выписывается, — но результат и есть та самая последовательность единиц и нулей, которая хранилась бы или передавалась по сети для этой строки.
Почему UTF-8, а не чистый ASCII
ASCII определяет всего 128 символов: этого с запасом хватает английскому и совсем не хватает всему остальному. UTF-8 оставляет первые 128 кодов неотличимыми от ASCII и разводит остальные по двум, трём или четырём байтам, поэтому английская строка даёт ровно те же байты, что и ASCII, а кириллица, иероглифы и эмодзи всё равно работают. Отсюда и разброс: латинская A — один байт (01000001), русская Я — два, иероглиф 中 — три, а большинство эмодзи — четыре.
Таблица перевода текста в двоичный код
Короткие строки и их двоичные байтовые последовательности. Интереснее всего строки с многобайтовыми символами: они показывают, как один символ превращается в группу байтов, у каждого из которых узнаваемый ведущий шаблон.
| Текст | Двоичная |
|---|---|
| A | 01000001 |
| Hi | 01001000 01101001 |
| OK | 01001111 01001011 |
| 123 | 00110001 00110010 00110011 |
| ! | 00100001 |
| Go | 01000111 01101111 |
Байт, которого вы не ждали
Самая частая неожиданность в работе с текстом — строка, которая длиннее, чем выглядит. Пять символов могут занимать пять байтов или пятнадцать, смотря по письменности, и любой лимит, выраженный в символах, будет нарушен лимитом, выраженным в байтах. Байтовая последовательность делает это наглядным: ведущие биты каждого байта в многобайтовом символе сами сообщают, сколько байтов занимает символ.
Байты и символы считаются по-разному
Когда столбец базы данных, ограничение API или поле заголовка измеряются в байтах, считайте байты, а не символы. Конвертер показывает байтовую последовательность напрямую, поэтому число групп равно числу байтов — именно эту величину такие ограничения и проверяют.
Частые вопросы
Как текст превращается в двоичный код?
Каждый символ ищется в таблице кодировки UTF-8 и заменяется своим байтом или байтами, а затем каждый байт записывается восемью двоичными цифрами. Латинская A — это байт 65, то есть 01000001, и она занимает ровно один байт, потому что попадает в исходный диапазон ASCII.
Почему один иероглиф занимает больше одного байта?
Потому что UTF-8 должен охватить куда больше 256 символов, и всё, что выходит за первые 128, раскладывается по двум, трём или четырём байтам. Один иероглиф обычно занимает три байта — поэтому здесь он и выглядит как три группы по восемь цифр, а не как одна.
Это то же самое, что ASCII?
Для простого английского текста — да: UTF-8 устроен так, что первые 128 кодов побайтово совпадают с ASCII, и «Hello» кодируется одинаково в обоих стандартах. Они расходятся ровно там, где появляется буква с диакритикой, символ валюты или любая нелатинская письменность: ASCII тут ничего не может предложить, а UTF-8 может.
Почему байты разделены пробелами?
Потому что сплошной поток двоичных цифр нечитаем и его легко пересчитать неверно, а группы по восемь цифр показывают границы байтов сразу. Пробелы во вводе игнорируются при декодировании, поэтому последовательность можно скопировать с этой страницы и вставить в обратный инструмент без правок.
Эмодзи тоже поддерживаются?
Да. Эмодзи лежат выше диапазона, до которого дотягиваются три байта, поэтому в UTF-8 большинство из них кодируется четырьмя байтами и здесь выглядит как четыре группы по восемь цифр. Одно эмодзи после кодирования может оказаться длиннее короткого английского слова.