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

→
Двоичные цифры → 8 бит на байт UTF-8 → декодированные символы

Двоичный код в текст: декодируем байты и понимаем, когда это невозможно

Что делает эта конвертация

Инструмент читает последовательность двоичных байтов и декодирует их как текст UTF-8. Восемь битов дают один байт, дальше байты декодируются вместе, потому что один символ может занимать несколько из них. Именно на этом шаге и происходит настоящая работа: границы байтов ничего не говорят о границах символов.

Как декодер понимает, где кончается символ

Ведущие биты каждого байта сообщают его роль. Байт, начинающийся с 0, стоит отдельно; начинающийся с 110 открывает двухбайтовый символ; 1110 открывает трёхбайтовый, а 11110 — четырёхбайтовый, тогда как байты продолжения начинаются с 10. Эта структура и позволяет декодеру идти по потоку, не зная заранее, где кончаются символы, и она же делает заметным поток, разрезанный не в том месте.

Таблица перевода двоичного кода в текст

Байтовые последовательности и текст, который они декодируют. Строки с многобайтовыми символами показывают ведущий шаблон в деле, а последняя строка — как выглядят сырые байты, не являющиеся печатным текстом.

ДвоичнаяТекст
01000001A
01100001a
01001000 01101001Hi
01001111 01001011OK
00110001 00110010 00110011123
11100100 10111000 10101101中

Откуда берутся кракозябры

Испорченный текст почти всегда означает, что байты декодировали не той кодировкой или разрезали не по той границе. Если прочитать UTF-8 как однобайтовую кодировку, трёхбайтовый символ превратится в три несвязанных знака, а потеря одного байта в начале сдвигает все последующие символы. Обе ошибки выглядят как случайная пунктуация, и обе диагностируются по байтам, а не по символам.

Сохраняйте байтовую группировку

Копируйте группы по восемь цифр целиком. Вставка с середины байта даёт последовательность, в которой декодер не сможет разобраться, а следующая за этим ошибка формально верна, но вовсе не очевидно, что дело в начале вставки.

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

Как декодировать двоичный код обратно в текст?

Разбейте двоичную строку на группы по восемь цифр, считайте каждую группу одним байтом и декодируйте байты как UTF-8. Латинская A — это 01000001, поэтому одна группа даёт один символ; более длинная последовательность даёт более длинную строку, причём некоторые символы занимают несколько групп.

Почему вместо странных символов я получаю ошибку?

Потому что эта последовательность байтов не является корректным UTF-8: она может быть обрезана, перепутана порядком или вообще не быть текстом. Отказ здесь намеренный: альтернатива — подставлять символы замены, а такой вывод выглядит как проблема декодирования даже тогда, когда настоящая причина в том, что байты никогда не были текстом.

Можно вставить двоичный код без пробелов между байтами?

Да. Непрерывная последовательность, длина которой кратна восьми, разбивается на байты автоматически, поэтому код из источника без разделителей конвертируется без переформатирования. Форма с пробелами и без них означает одно и то же.

Что означает байт больше 127 сам по себе?

Что он часть многобайтового символа, а не самостоятельный символ. Одиночный байт из этого диапазона не имеет корректного значения в UTF-8 и отклоняется — это правильная реакция, ведь символ, которому он принадлежал, неполон.

Это работает для текста на любом языке?

Да, для всего, что представимо в UTF-8, а это практически все письменности, которые сейчас используются: латиница с диакритикой, кириллица, арабский, китайский, японский, корейский и эмодзи. Последовательность, полученная в инструменте «текст в двоичный код» на этом сайте, всегда декодируется обратно ровно в исходный текст.

Скопируйте приведённый ниже код и вставьте его на свой сайт, чтобы добавить этот конвертер.

<!-- Двоичный код в текст -->
<iframe src="https://unitflow.net/ru/embed/binary-to-text" title="Двоичный код в текст" width="100%" height="420" loading="lazy" style="border:0;max-width:100%;display:block"></iframe>
<p><a href="https://unitflow.net/ru/binary-to-text" target="_blank" rel="noopener">Работает на UnitFlow</a></p>