Текст — это числа
Компьютер хранит текст как числа. У каждого символа есть кодовая точка (буква A — 65, a — 97, 0 — 48), а кодировка определяет, как это число превращается в байты. ASCII покрывает 128 символов по одному байту каждый; Unicode покрывает более миллиона, а UTF-8 — кодировка, которая записывает их от одного до четырёх байт, оставляя ASCII без изменений.
Так, Hi — это 72 и 105, что в двоичном виде 01001000 и 01101001, а в hex — 48 69. Буква é с диакритикой — кодовая точка 233, но хранится как два байта, C3 A9; галочка ✓ — три байта, E2 9C 93; эмодзи — четыре.
Как UTF-8 упаковывает кодовую точку
| Диапазон кодовых точек | Байт | Раскладка битов |
|---|---|---|
| U+0000 – U+007F | 1 | 0xxxxxxx |
| U+0080 – U+07FF | 2 | 110xxxxx 10xxxxxx |
| U+0800 – U+FFFF | 3 | 1110xxxx 10xxxxxx 10xxxxxx |
| U+10000 – U+10FFFF | 4 | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
Старшие биты первого байта сообщают длину последовательности, а каждый байт продолжения начинается с 10. Такая конструкция позволяет декодеру ресинхронизироваться после ошибки, и именно поэтому в тексте UTF-8 можно искать побайтово.
Справка по ASCII
Печатаемый ASCII идёт от 32 (пробел) до 126 (~). Цифры — 48–57, заглавные буквы — 65–90, строчные — 97–122. Разница между верхним и нижним регистром — ровно бит 5 (значение 32), поэтому c | 0x20 переводит ASCII-букву в нижний регистр. Коды 0–31 — управляющие символы: 9 — табуляция, 10 — перевод строки, 13 — возврат каретки, 27 — escape.
Вопросы
Как перевести текст в двоичный код вручную?
Найдите ASCII-код каждого символа (A = 65), затем переведите это десятичное число в двоичное и дополните до 8 бит: 65 = 01000001. Не-ASCII символы сначала нужно превратить в байты UTF-8.
Почему один символ превращается в несколько байт?
Потому что UTF-8 использует 2, 3 или 4 байта для всего за пределами ASCII. é — это C3 A9, 日 — E6 97 A5, 😀 — F0 9F 98 80. Таблица под инструментом показывает это для каждого символа.
Какой двоичный код у буквы A?
01000001 (десятичное 65, hex 41). Строчная a — 01100001 (97, hex 61): то же самое с установленным битом 5.
Почему перевод из двоичного в текст выдаёт ошибку?
Каждая группа должна быть байтом (8 двоичных цифр или значение 0–255), а байты должны образовывать корректный UTF-8. Одиночный байт больше 127 или байт продолжения без ведущего байта — не валидный текст.
Это то же самое, что Base64?
Нет. Здесь показаны реальные байты текста в читаемой системе счисления. Base64 — другая, более плотная схема для передачи произвольных байтов в виде текста. См. инструмент Base64.