Как закодировать ASCII-текст в Base64
- Введите или вставьте текст в поле Ввод · текст. Кодировка уже переключена на ASCII.
- Base64 появится в поле Результат · Base64. Если в тексте есть символы вне ASCII, под инструментом появится предупреждение о том, сколько из них заменено на
?. - Удалите или замените эти символы либо переключите поле Кодировка на UTF-8, если получатель его понимает.
- Скопируйте результат или скачайте его как
base64.txt.
Обратное преобразование делает Base64 в ASCII.
Что считается ASCII
ASCII определяет 128 кодов, от 0 до 127, по одному байту на каждый со сброшенным старшим битом. Коды с 32 по 126 отведены под печатные символы: пробел, цифры, латинские буквы и распространённая пунктуация. Коды с 0 по 31 и 127 отведены под управляющие символы, например табуляцию (9), перевод строки (10) и возврат каретки (13).
Всё остальное, включая кириллицу, é, ß, €, типографские кавычки, неразрывные пробелы и эмодзи, к ASCII не относится. В тексте, скопированном из текстовых редакторов и веб-страниц, такие символы легко не заметить: чаще всего это типографские кавычки и тире. Их выловит предупреждение о замене.
Примеры
| Текст | Base64 | Примечание |
|---|---|---|
Hello, ASCII! | SGVsbG8sIEFTQ0lJIQ== | Совпадает с UTF-8 |
200 OK | MjAwIE9L | 6 байт, без дополнения |
{}[]<> | e31bXTw+ | Пунктуация кодируется как обычные байты |
a, табуляция, b | YQli | Табуляция: байт 09 |
line1 CR LF line2 | bGluZTENCmxpbmUy | 0D 0A посередине |
user:pass | dXNlcjpwYXNz | Учётные данные HTTP Basic auth |
Grüße | R3I/P2U= | 2 символа заменены на ? |
naïve café | bmE/dmUgY2FmPw== | 2 символа заменены на ? |
Поскольку каждый символ кодируется одним байтом, размер легко предсказать: n символов дают 4 × ⌈n / 3⌉ символов Base64.
Почему ASCII и Base64 связаны
Base64 придумали для каналов, которые надёжно передавали только 7-битный ASCII. Классический пример: ранняя электронная почта (SMTP). Байты выше 127 по дороге могли срезаться или искажаться, поэтому двоичные вложения и неанглийский текст кодировали в подмножество ASCII, с которым справлялась любая система. Base64 существует до сих пор именно поэтому, и этим же объясняется его алфавит: 64 печатных символа, одинаковых во всех кодировках на основе ASCII и, кроме + и /, не имеющих особого смысла в распространённых форматах. Механика разобрана в статье как работает Base64.
Некоторые системы до сих пор ждут только ASCII, например старые интерфейсы и значения HTTP-заголовков, где обработка не-ASCII различается от сервера к серверу. Если закодировать текст здесь в режиме ASCII, ещё до отправки будет видно, безопасен ли он для них. Для заголовка Authorization есть отдельный генератор заголовка Basic Auth, который собирает значение целиком, вроде Basic dXNlcjpwYXNz.
ASCII в Base64 в коде
Python по умолчанию отвергает не-ASCII символы, и это удобная проверка:
import base64
base64.b64encode("200 OK".encode("ascii")).decode() # 'MjAwIE9L'
"Grüße".encode("ascii")
# UnicodeEncodeError: 'ascii' codec can't encode characters in position 2-3
"Grüße".encode("ascii", errors="replace") # b'Gr??e', like this tool
В JavaScript btoa() принимает любые символы с кодом до 255, так что латинские буквы из Latin-1 вроде ü он не поймает. Если строка должна быть чистым ASCII, сначала проверьте её через /^[\x00-\x7F]*$/.test(s). Подробнее на страницах Python и JavaScript.
Вопросы и ответы
Отличается ли ASCII в Base64 от UTF-8 в Base64?
Для чистого ASCII-текста нет. UTF-8 устроен так, что первые 128 символов сохраняют свои байтовые значения из ASCII, поэтому Hello, ASCII! в обоих случаях даёт SGVsbG8sIEFTQ0lJIQ==. Разница появляется, только если в тексте есть другие символы.
Что происходит с символами вроде ü или эмодзи?
В ASCII для них нет кода, поэтому каждый превращается в ? (байт 3F), а инструмент сообщает, сколько символов заменено. Grüße кодируется в R3I/P2U=, а это декодируется в Gr??e.
Результат в Base64 тоже состоит из ASCII?
Да. Все 65 символов, которые использует Base64 (A–Z, a–z, 0–9, +, / и =), входят в печатные символы ASCII, поэтому Base64 проходит через системы, которые умеют работать только с 7-битным текстом.
Можно ли закодировать управляющие символы, например табуляцию и перевод строки?
Да. Это тоже ASCII (коды 0–31), и они кодируются как любой другой байт: a, табуляция, b дают YQli.