Кодирование / декодирование URL
КодированиеПроцентное кодирование компонентов URL и полных URL (RFC 3986).
На этой странице
Что такое URL-кодирование?#
URL может содержать лишь небольшой набор неэкранированных символов — ASCII-буквы, цифры и горстку знаков, таких как -, _, ., ~. Всё остальное (пробел, &, китайский иероглиф, эмодзи, даже /, когда он означает данные, а не разделитель пути) обязано быть записано как процентно-кодированная escape-последовательность: % с двумя шестнадцатеричными цифрами, например %20 для пробела или %E4%B8%AD для UTF-8-байтов символа 中. URL-кодирование — механический перевод, делающий произвольный текст безопасным для передачи внутри URL.
Есть две разные задачи, которые постоянно путают, и этот инструмент открывает обе через селектор Параметры:
- Режим «Компонент» (путь JavaScript
encodeURIComponent) экранирует всё, что не является буквой, цифрой или одним из- _ . ! ~ * ' (. Используйте его, когда текст — отдельный кусок данных, который вы собираетесь поместить в параметр запроса, сегмент пути или фрагмент, чтобы символы со структурным значением (/ ? & = #) превратились в безобидный литеральный текст. - Режим «Полный» (путь
encodeURI) экранирует те же небезопасные байты, но намеренно оставляет в покое собственные структурные символы URL (: / ? # [ ] @ ! $ & ' ( ) * + , ; =). Используйте его, когда у вас уже есть целый URL правильной формы и нужно лишь почистить литеральные символы внутри него.
Декодирование обращает любую из форм. Когда ввод содержит malformed-последовательность вроде %GG (некорректный hex) или одиночный %, инструмент сообщает об ошибке и указывает на проблемную позицию, а не угадывает.
Как пользоваться#
- Выберите Кодировать или Декодировать переключателем в левом верхнем углу.
- В Параметры выберите Компонент для отдельного значения, помещаемого в URL, или Полный для целого URL, который должен сохранить свою структуру.
- Вставьте текст в панель Ввод слева.
- Прочитайте результат в панели Вывод справа и нажмите Копировать.
- Пример загружает демонстрационную строку; Очистить сбрасывает панели.
Ключевые возможности#
- Две реальные области действия, а не одна. «Компонент» против «Полный» в точности повторяет различие
encodeURIComponent/encodeURI, поэтому экранировать отдельное значение или причесать весь URL можно без смены инструмента. - UTF-8 по умолчанию. Не-ASCII символы кодируются как их UTF-8-байтовая последовательность (стандарт со времён RFC 3986), поэтому
中文становится%E4%B8%AD%E6%96%87, а не одно-escape’ным Latin-1-блоком. - Ошибки указывают позицию. Когда декодирование натыкается на некорректную
%-escape, строка состояния сообщает, где она, вместо того чтобы выбрасывать весь ввод. - Работает локально. Всё происходит в вашем браузере; ничто из введённого не загружается.
Разбор примера#
Кодирование фрагмента a/b?c=d & e в режиме Компонент даёт:
a%2Fb%3Fc%3Dd%20%26%20e
Заметьте, что / становится %2F, ? становится %3F, = становится %3D, пробел становится %20, а & становится %26 — каждый символ, который иначе мог бы быть прочитан как структура URL, нейтрализован. Это правильная форма для упаковки всей строки в одно значение запроса.
Теперь переключитесь в режим Полный и закодируйте целый URL:
https://example.com/path?q=hello world&lang=zh CN
Результат сохраняет протокол, косые черты, ? и & нетронутыми и экранирует лишь литеральные пробелы:
https://example.com/path?q=hello%20world&lang=zh%20CN
В этом разница между двумя режимами одним взглядом: «Компонент» сплющивает всё до данных, «Полный» сохраняет скелет URL и чистит лишь те байты, что нуждались в чистке.
FAQ#
Компонент или Полный — как решить?#
Если вы собираете строку запроса и одно из значений пришло от пользователя, кодируйте это значение режимом Компонент. Если у вас уже полностью готовый URL, просто содержащий несколько случайных символов (пробелы, акценты), пропустите его целиком через Полный. Полезная проверка: нужно ли, чтобы вывод по-прежнему работал как ссылка благодаря своим ?, & и /? Тогда используйте «Полный». Эти символы на самом деле часть данных? Тогда «Компонент».
В декодированной строке есть %GG, и инструмент выдаёт ошибку. Почему?#
За % всегда должны следовать две шестнадцатеричные цифры. %GG — некорректный hex, поэтому декодер его отвергает и сообщает позицию — то же, что выбросило бы URIError в коде. Либо поправьте источник, чтобы он посылал %25 (кодированная форма литерального %), либо исправьте malformed-escape.
Кодировать до или после сборки строки запроса?#
Кодируйте каждое значение до того, как соединять его через = и &. Если сначала собрать ?q=a & b, а затем закодировать всё целиком режимом «Компонент», = и & тоже экранируются и сервер перестанет видеть их как разделители. Кодируйте куски, затем собирайте.
Обрабатывает ли инструмент Unicode так же, как браузеры?#
Да. Современные браузеры и серверы ожидают, что процентные escape-последовательности несут UTF-8-байты, и именно это выдаёт инструмент — 中 становится %E4%B8%AD. Если вы отлаживаете старую систему, ждущую унаследованную однобайтовую кодировку (Latin-1, GBK и т. п.), байты будут отличаться, и понадобится инструмент под конкретную кодировку.