Перейти к содержимому

Декодировать URL

Превратите %E2%9C%93 обратно в ✓. Строки с двойным кодированием, кодирование форм и наполовину повреждённый ввод обрабатываются, а не отклоняются. Ничего не сохраняется.

  • Не сохраняется
  • Без очереди и ожидания
  • Без регистрации и водяных знаков
Декодировано

Здесь появится результат: Декодировано.

Как это работает

1

Вставьте закодированный текст

Целый URL, строку запроса или одно значение.

2

При необходимости выберите вариант

Стандартное декодирование или декодирование форм, где + означает пробел. Если не уверены, страница покажет, когда результаты расходятся.

3

Скопируйте результат

Декодируйте ещё раз, если текст был закодирован дважды: это случается часто, и заметить это легко, если знаешь, что искать.

Неоднозначность, которую за вас не решит никто

Декодирование устроено механически просто — найти каждый % с двумя шестнадцатеричными цифрами после него, превратить обратно в байт, затем прочитать байты как UTF-8, — и в нём ровно одна настоящая неоднозначность. Знак плюса может означать пробел, а может — плюс. В отправленной форме это пробел, по соглашению, которое старше самой спецификации URL. В сегменте пути это обычный символ. В самом тексте ничего не говорит, какой случай перед вами, поэтому страница показывает оба прочтения, а не выбирает одно и тихо ошибается. Важнее всего это там, где ошибка бьёт больнее всего: в адресе электронной почты или в значении base64, где плюс — настоящие данные.

Текст не на латинице превращается в несколько процентных последовательностей на каждый символ, потому что кодирование работает с байтами UTF-8, а не с символами: буква с диакритикой или кириллическая буква — это две последовательности, большинство символов — три, эмодзи — четыре. Если декодировать последовательность, которая не является корректным UTF-8, получатся символы замены — обычно это знак, что текст кодировали из другой кодировки или обрезали посреди символа.

Двойное декодирование — это уязвимость, а не просто ошибка. Если значение декодируют, проверяют, а потом декодируют снова, злоумышленник может спрятать символы от проверки: %252e%252e%252f проходит фильтр, ищущий «../», потому что после первого прохода это всё ещё %2e%2e%2f, а после второго — тот самый выход из каталога, который фильтр должен был остановить. Декодируйте ровно один раз, потом проверяйте, и никогда не в обратном порядке.

Текст, который никогда не кодировался, возвращается без изменений, а не искажается — это полезно, когда вы не уверены, нужно ли вообще декодировать строку. Знак процента, за которым не идут две шестнадцатеричные цифры, остаётся как есть и не считается ошибкой: это буквальный процент, частый в тексте, который вставили, а не закодировали.

Если нужно другое

В коде декодер должен соответствовать кодировщику. В JavaScript есть decodeURIComponent; в Python unquote и unquote_plus разделены именно из-за вопроса о плюсе; в PHP по той же причине есть rawurldecode и urldecode. А лучше доверьте это типу URL или парсеру строки запроса — большинство фреймворков сами декодируют параметры, и повторное декодирование после них и порождает описанную выше ошибку двойного декодирования.

Чтобы разобрать длинный URL, а не декодировать одно значение, парсер лучше декодера: python -c "import urllib.parse,sys; print(urllib.parse.urlparse(sys.argv[1]))" раскладывает адрес на части, чтобы вы видели, где что, ещё до декодирования — а когда ссылка ведёт себя странно, вопрос обычно именно в этом.

Частые вопросы

После декодирования в тексте всё ещё есть %25

Значит, его закодировали дважды, и это очень частая ситуация: так бывает всякий раз, когда уже закодированное значение кодируется снова по пути через редирект или систему логирования. %25 — это код самого символа %, поэтому первое декодирование превращает %2520 в %20, а второе — в пробел. Просто декодируйте ещё раз. Страница подскажет, если заметит такую картину.

Должен ли «+» становиться пробелом?

Зависит от того, откуда пришла строка, поэтому здесь выбор, а не догадка. В теле application/x-www-form-urlencoded — отправленной HTML-форме — + означает пробел. В сегменте пути или в данных, которые просто прошли через URL, + — это обычный плюс, и превращение его в пробел портит значение. Больнее всего это бьёт по строкам Base64: в них есть настоящие символы +, и декодирование как формы их разрушает.

Что будет с повреждённой строкой?

Декодируется всё, что можно, а остальное остаётся как есть, вместо отказа от всего. Одиночный %, который не входит в корректную escape-последовательность (частый случай, когда текст уже частично декодирован или обрезан), заставляет встроенный декодер браузера выбросить ошибку и ничего не вернуть. Здесь каждая корректная последовательность декодируется, а лишние символы остаются на месте — это гораздо полезнее, когда вы пытаетесь прочитать испорченную строку лога.

Где-нибудь сохраняется мой текст?

Нет. Ничего не сохраняется, и никакие запросы не отправляются. После загрузки страницы можно отключиться от интернета — она продолжит работать.

Можно декодировать весь URL целиком?

Да. Вставьте его полностью: структура остаётся читаемой, а в текст превращаются только закодированные части, так что длинный URL с несколькими закодированными параметрами становится тем, что действительно можно прочитать.

Полезно знать: Знак плюса неоднозначен: в строке запроса он означает пробел, а в пути — обычный плюс. Страница декодирует обоими способами и показывает, где какой вариант, а не гадает. Текст, который никогда не кодировался, возвращается без изменений, а не искажается.

Разместите этот инструмент на своём сайте

Бесплатно для любого блога, страницы класса или справочной статьи. Вставьте один фрагмент кода — и посетители смогут пользоваться инструментом прямо на вашей странице.