Как закодировать текст в Base64
- Введите или вставьте текст в поле Ввод · текст. Страница открывается с примером; чтобы начать с чистого листа, нажмите Очистить.
- Base64 появляется в поле Результат · Base64 прямо по ходу ввода. Для очень больших данных можно снять флажок На лету и нажимать Выполнить.
- Выставьте параметры, которых ждёт принимающая сторона: URL-safe (- _), Без дополнения (=), Перенос строк и Кодировка. Значения по умолчанию (стандартный алфавит, с дополнением, одна строка, UTF-8) подходят большинству API.
- Нажмите Скопировать результат или Скачать, чтобы сохранить результат в
base64.txt. - Чтобы проверить обратное преобразование, нажмите Поменять местами: Base64 переедет в поле ввода, а инструмент переключится на декодирование.
Под кнопками показан размер входных данных в байтах, размер результата и прирост в процентах. Это удобно, когда у поля есть ограничение по длине.
Как работает кодирование Base64
Base64 работает с байтами, поэтому сначала текст превращается в байты по какой-то кодировке (здесь это UTF-8, если не выбрать другую). Затем кодировщик берёт байты по три, то есть по 24 бита, делит их на четыре 6-битных числа и записывает каждое одним символом из 64-символьного алфавита: A–Z, a–z, 0–9, + и /.
Классический пример с текстом Man: байты 4D 61 6E превращаются в TWFu. Если в последней группе только один или два байта, результат дополняется знаками =: Ma становится TWE=, а M превращается в TQ==. Весь разбор по шагам есть в статье как работает Base64, а в материале про дополнение объясняется, когда = можно отбросить.
Для n байт длина результата всегда равна 4 × ⌈n / 3⌉ символов, то есть примерно на 33% больше входа. Калькулятор размера Base64 посчитает это для любого объёма, а статья о накладных расходах Base64 объясняет, когда это важно. Раскодировать Base64 может кто угодно, так что он ничего не скрывает; прежде чем класть в него секреты, прочитайте про кодирование и шифрование.
Параметры кодирования
| Параметр | Что меняет | Когда нужен |
|---|---|---|
| URL-safe (- _) | + заменяется на -, а / на _ (RFC 4648, раздел 5) | URL, query-строки, имена файлов, cookie, JWT. В кодировщике Base64URL он включён по умолчанию |
| Без дополнения (=) | Убирает = в конце | JWT и большинство URL-safe форматов; всё, что и так отрезает = |
| Перенос строк: 76 (MIME) | Вставляет перевод строки каждые 76 символов | Тела писем и вложения (кодировщик MIME) |
| Перенос строк: 64 (PEM) | Вставляет перевод строки каждые 64 символа | Сертификаты и ключи между строками -----BEGIN и -----END |
| Кодировка | В какие байты превращается каждый символ перед кодированием | UTF-8, если получатель не ждёт UTF-16, Windows-1251, Shift_JIS или другую устаревшую кодировку |
Примеры с Unicode, эмодзи и URL-safe
Все значения ниже получены модулем base64 из Python и совпадают с тем, что выдаёт этот инструмент.
| Ввод | Настройки | Base64 |
|---|---|---|
Hello | UTF-8 | SGVsbG8= |
Hello, world! | UTF-8 | SGVsbG8sIHdvcmxkIQ== |
café | UTF-8 | Y2Fmw6k= |
café | ISO-8859-1 | Y2Fm6Q== |
€ | UTF-8 | 4oKs |
€ | Windows-1252 | gA== |
👋 | UTF-8 | 8J+Riw== |
👋 | UTF-8, URL-safe, без дополнения | 8J-Riw |
Привет | UTF-8 | 0J/RgNC40LLQtdGC |
Привет | Windows-1251 | z/Do4uXy |
Одно и то же слово даёт разный Base64 в разных кодировках, потому что различаются байты: é в UTF-8 занимает два байта (C3 A9), а в Latin-1 один (E9). Эмодзи с машущей рукой занимает четыре байта UTF-8, поэтому в Base64 он превращается в 8 символов, и два из них приходятся на дополнение.
Кодировки и символы, которые в них не помещаются
UTF-8 умеет представить любой символ Unicode, поэтому ничего не теряет. Остальные 26 кодировок в списке (UTF-16LE/BE, UTF-32LE, ASCII, кодовые страницы ISO-8859 и Windows, KOI8-R/U, CP866, Shift_JIS, EUC-JP, GBK, Big5 и EUC-KR) нужны для систем, которые их ожидают. Если в тексте есть символ, которого нет в выбранной кодировке, он заменяется на ?, а предупреждение сообщает, сколько символов заменено. Например, € в ISO-8859-1 кодируется как Pw==, то есть как обычный знак вопроса.
Для строк Windows и .NET, а также для PowerShell выбирайте UTF-16LE (причины объясняет страница UTF-16 в Base64). ASCII нужен, когда система должна отвергать всё, что выходит за пределы 7-битного текста (ASCII в Base64).
Перенос строк
Обычный Base64 записывается одной длинной строкой, и именно такая нужна для JSON, HTTP-заголовков, URL и переменных окружения. В почте строки по 76 символов (RFC 2045), в файлах PEM по 64. Параметр переноса вставляет переводы строки \n на заданной ширине. Декодеры, включая декодер на этом сайте, пропускают переводы строк, так что результат с переносами декодируется в те же байты. Правила MIME разобраны в статье Base64 в электронной почте.
Частые ошибки при кодировании
- В конец пробирается перевод строки.
echo Hello | base64выводитSGVsbG8K, потому чтоechoдобавляет\n. Сам текстHelloкодируется вSGVsbG8=. Используйтеprintf '%s', а при вставке сюда проверьте, что число байтов на входе такое, как вы ожидаете. btoa()падает на Unicode. В браузереbtoa("Grüße 👋")выбрасываетInvalidCharacterError, потому чтоbtoaпринимает только символы Latin-1. Сначала переведите строку в байты UTF-8, как во фрагменте ниже.- У получателя другая кодировка. Если вы кодируете в UTF-8, а другая сторона декодирует как Latin-1,
caféпревращается вcafé. Договоритесь о кодировке или выберите здесь кодировку получателя. - Двойное кодирование. Base64 от
SGVsbG8=даётU0dWc2JHOD0=. Если значение декодируется в очередной Base64, где-то в цепочке его закодировали второй раз. +и/ломают URL. В query-строке+читается как пробел. Включите URL-safe, возьмите кодировщик Base64URL или примените к значению percent-encoding.
Кодирование Base64 в JavaScript, Python и командной строке
В браузерном JavaScript строку переводят в байты UTF-8 через TextEncoder, а затем кодируют байты. Новые браузеры умеют вызывать bytes.toBase64() напрямую (Uint8Array.toBase64).
const bytes = new TextEncoder().encode("Grüße 👋");
let bin = "";
for (const b of bytes) bin += String.fromCharCode(b);
btoa(bin); // "R3LDvMOfZSDwn5GL"
// Node.js
Buffer.from("Grüße 👋", "utf8").toString("base64"); // "R3LDvMOfZSDwn5GL"
Buffer.from("👋", "utf8").toString("base64url"); // "8J-Riw"
В Python b64encode принимает байты и возвращает байты:
import base64
base64.b64encode("Grüße 👋".encode("utf-8")).decode("ascii")
# 'R3LDvMOfZSDwn5GL'
base64.urlsafe_b64encode("👋".encode()).rstrip(b"=").decode()
# '8J-Riw'
В Linux и macOS команда base64 кодирует стандартный ввод:
printf '%s' 'Grüße 👋' | base64
base64 -w 0 file.bin > file.b64
Первая команда выводит R3LDvMOfZSDwn5GL. GNU base64 в Linux по умолчанию переносит вывод на 76-й колонке, а -w 0 это отключает; версия в macOS без явной просьбы не переносит. Другие языки и тонкости: Base64 в JavaScript, Node.js, Python и PHP.
Картинки, PDF и любые другие файлы кодирует инструмент для файлов, в том числе в data URI и JSON.
Вопросы и ответы
Как закодировать строку в Base64?
Вставьте строку в поле ввода выше и скопируйте результат из поля вывода. В коде строку сначала переводят в байты UTF-8 и кодируют уже их: base64.b64encode(s.encode()) в Python, Buffer.from(s).toString("base64") в Node.js.
Почему Base64 заканчивается на = или ==?
Base64 работает блоками по 3 байта. Если длина входных данных не кратна 3, последний блок неполный, и = отмечает недостающие байты: один =, если осталось 2 байта, ==, если остался 1. Подробнее в статье про дополнение.
Почему другой сервис выдаёт другой Base64 для того же текста?
Обычно дело в незаметной разнице в байтах: перевод строки в конце (echo его добавляет), другая кодировка (UTF-8, Latin-1 или UTF-16) или нормализация Unicode. Сравните число байтов на входе, которое показано под инструментом.
Можно ли спрятать пароль с помощью Base64?
Нет. У Base64 нет ключа, и раскодировать его может кто угодно за секунду. Base64 нужен для передачи данных, а для защиты используйте настоящее шифрование или хеширование. См. кодирование и шифрование.
Насколько вырастает текст после кодирования в Base64?
Каждые 3 байта превращаются в 4 символа, поэтому результат примерно на 33% больше, плюс переносы строк, если они включены. 100 байт UTF-8 дают 136 символов.