Что означают «encoder» и «decoder» для URL?
Кодирование URL («url encode», «urlencode») превращает каждый недопустимый символ в адресе — пробел, букву с диакритикой, амперсанд, знак плюса — в последовательность: знак процента и две шестнадцатеричные цифры его байта. Декодирование URL («url decode», «decoder url») читает эти последовательности в обратном порядке: байты восстанавливаются и преобразуются в символы в заявленной кодировке, чаще всего UTF-8. Именно эту пару ищут, когда вводят «encoder decoder url» или «percent encoding online».
Percent-encoding — это ни сжатие, ни шифрование: слово с диакритикой становится вдвое длиннее, и прочитать его может любой на глаз. Его единственная задача — провести любой байт в URL, которая по умолчанию допускает только подмножество ASCII. В свою очередь Base64 переносит байты по полностью текстовым каналам — визуально они похожи, но не взаимозаменяемы.
Как закодировать URL в percent-encoding
Шаг 1: текст преобразуется в байты в выбранной кодировке — по умолчанию UTF-8. Шаг 2: для каждого байта проверяется, входит ли соответствующий символ в список разрешённых символов выбранной области. Шаг 3: если входит, он копируется как есть, иначе становится %XX, где XX — две шестнадцатеричные цифры байта. Шаг 4: если опция пробела в + включена, байт 32 заменяется знаком плюса вместо %20.
Наглядный пример: « café & été » в области компонент даёт caf%C3%A9%20%26%20%C3%A9t%C3%A9. Просто введите этот текст в кодировщик: результат, размер входа, размер выхода и прирост появятся раньше, чем вы отпустите клавишу.
Четыре области кодирования
Область «компонент» сохраняет только буквы, цифры и - _ . ! ~ * ' ( ) — это значение параметра, оно соответствует encodeURIComponent. А «строка запроса» сохраняет также амперсанды и знаки равенства — чтобы пересобрать целую query string. А «сегмент пути» допускает / : @ & = + $ , ; чтобы не ломать косые черты. Полная URL добавляет ещё ?, #, [ и ] : почти ничего не экранируется — пробелы и не-ASCII-символы уходят в %XX.
Как декодировать закодированную URL
Декодирование сканирует строку слева направо: знак процента и две шестнадцатеричные цифры дают байт, любой другой символ копируется после преобразования в выбранной кодировке. Затем байты группируются и превращаются в символы — два для «é», три для «日», четыре для эмодзи. Вкладка «Декодировать» показывает каждую найденную последовательность, её позицию в строке, байты и соответствующий текст.
Если после знака процента нет двух допустимых цифр, ошибка явная: неполная последовательность или недопустимый шестнадцатеричный символ. Кнопка «Исправить %» заменяет одиночные проценты на %25, и строка становится декодируемой без потери информации — самый безопасный вариант для частично экранированной URL.
Пробел: %20 или + — правило форм
%20 является строгим пробелом в percent-encoding: он работает в пути, запросе, фрагменте и заголовках. Знак +, в свою очередь, — пробел только в формате application/x-www-form-urlencoded используемом HTML-формами и исторически — query strings. В остальных случаях это обычный знак плюса — а поскольку его легко спутать, его нужно экранировать в %2B при кодировании значения.
На практике: чтобы заполнить поле формы или повторить поведение <form>, отметьте «Пробел в + ». Для URL редиректа, canonical или общей ссылки всегда предпочитайте %20. Декодер же считает + по умолчанию пробелом, и это поведение можно отключить одним нажатием.
RFC 3986: unreserved, sub-delims и gen-delims
RFC 3986 делит ASCII-символы на три категории. К незарезервированным символам — буквам, цифрам, - _ . ~ — всегда сохраняются как есть. К суб-разделителям ! $ & ' ( ) * + , ; = и общим разделителям : / ? # [ ] @ придают структурный смысл: они разделяют authority, путь, запрос и фрагмент. Всё остальное — пробел, кавычки, угловые и фигурные скобки, знак процента — должно быть закодировано.
Это ровно те категории, которые вкладка «RFC 3986 & справка» показывает символ за символом: нажмите на плитку, чтобы увидеть её шестнадцатеричный код, категорию и области, в которых она сохраняется. Это самый быстрый способ ответить на вопрос «нужно ли экранировать этот символ?».
Символы с диакритикой, эмодзи и UTF-8
URL переносит только безопасные ASCII-байты, поэтому любой символ выше U+007F нужно кодировать. В UTF-8 «é» имеет код C3 A9 и превращается в %C3%A9, «日» занимает три байта и даёт три последовательности, эмодзи занимает четыре и разворачивается в восемь закодированных символов. Если результат кажется длинным — это не баг, а цена совместимости со всеми протоколами. И наконец, следите за исходной кодировкой: декодирование в UTF-8 строки, закодированной в Latin-1, даёт кракозябры — отсюда четыре варианта на вкладке «Декодировать».
Почему encodeURIComponent не всегда достаточно
encodeURIComponent кодирует всё, кроме A-Z a-z 0-9 - _ . ! ~ * ' ( ), что подходит для значения параметра, но ломает полную URL, так как экранирует и косые черты, и двоеточия, и амперсанды. encodeURI делает наоборот: он сохраняет структуру URL, но пропускает пробелы и буквы с диакритикой, поэтому падает на обычном тексте. Здесь покрыты оба варианта — и даже больше: область «Строка запроса» и область «Сегмент пути» закрывают разрыв между ними.
Percent-encoding и Base64: два разных инструмента
Percent-encoding заменяет байт за байтом и сохраняет читаемость исходного текста, но заметно удлиняет строку. Base64 группирует байты по три и переписывает их алфавитом из 64 символов: компактно, но совершенно нечитаемо и в таком виде непригодно для URL без варианта URL-safe. Вкладка «Перекрёстное кодирование» показывает и то и другое с первого взгляда, а вдобавок шестнадцатеричные байты, HTML-сущности и экранированную строку JSON — чтобы выбрать нужное представление до копирования.
Частые ошибки: двойное кодирование и одиночный %
Чаще всего одну и ту же строку экранируют дважды: пробел становится %20, затем %2520, и сервер получает буквально «%20». Вторая — забыть сам знак процента, который должен стать %25 — иначе декодер принимает его за начало последовательности и падает либо обрезает строку. И наконец, оставить + неэкранированным в параметре формы — значит добавить пробел, которого вы не просили. Декодер сообщает о некорректных последовательностях, а кнопка «Исправить %» исправляет второй случай без потерь.
Где прячутся закодированные URL
В query strings отслеживания UTM, в redirect_uri и состояниях OAuth, в webhooks с вложенными параметрами в целевой URL, в URL обратного вызова с подписью, в журналах сервера, в sitemap и canonical, в <a href> создаваемых на стороне клиента, в JWT с payload в Base64URL, в data: и заголовки Location, и в любой HTML-форме, отправляемой методом GET. Уметь за секунду закодировать и декодировать избавляет от необходимости открывать терминал ради одной строки.
Производительность и лучшие практики
В браузере кодирование и декодирование линейны и почти ничего не стоят, даже на нескольких мегабайтах: каждый символ обрабатывается один раз — без рекурсии и без выделения памяти на символ. Единственные ловушки — двойное кодирование (всегда проверяйте round-trip перед сохранением) и URL длиной в несколько килобайт, которые прокси часто обрезают за 2000 символов. Документируйте использованную область рядом с полученной строкой: «компонент» и «Полная URL» дают разный результат на одном и том же тексте.
Кому подходит
Бэкенд- и фронтенд-разработчикам (query strings, редиректы, OAuth), интеграторам и техническим авторам (UTM-ссылки, canonical, трекинг), администраторам и DevOps (webhook, подписанные URL, журналы), тестировщикам и пентестерам (fuzzing параметров, обход фильтров), студентам (UTF-8, ASCII и RFC 3986) и всем, кому нужен онлайн-кодировщик и декодировщик URL — быстрый, полнофункциональный и конфиденциальный, а дополнением служит кодировщик и декодировщик Base64 и форматтер JSON.