Что делает процентное кодирование
В URL допустим лишь ограниченный набор символов. Всё остальное переводится в байты UTF-8, и каждый байт записывается знаком процента и двумя шестнадцатеричными цифрами. Пробел становится %20, буква «я» — %D1%8F, а китайский, японский или корейский символ из трёх байтов — девятью знаками.
Этот инструмент различает кодирование целого адреса и кодирование одного значения. В целом адресе структурные знаки вроде косых черт и вопросительного знака должны уцелеть; в отдельном значении — скажем, в поисковом запросе — те же знаки, наоборот, нужно закодировать, иначе параметр разорвётся.
Декодирование идёт в обратную сторону, превращая каждую тройку с процентом обратно в байт и читая итог как UTF-8. Чаще всего оно нужно, чтобы восстановить исходный поисковый запрос из адреса, записанного в журнале или в реферере.
Выбрать не ту область кодирования
Закодировав одно значение так, будто это целый адрес, вы обрежете параметр. Если в поисковом запросе есть амперсанд и его оставили как есть, сервер прочитает с этого места новый параметр. Значениям в строке запроса нужно кодирование на уровне компонента.
Обратное тоже не работает: кодирование целого адреса на уровне компонента переписывает косые черты и двоеточие, и ссылка перестаёт открываться. Кодирование компонента уместно, когда готовый URL везут внутри другого URL как параметр, и неуместно, когда результат идёт прямо в адресную строку.
Закодировав уже закодированную строку ещё раз, вы превратите каждый знак процента в %25 и получите двойной слой. Несколько вхождений %25 в выводе почти всегда означают именно это, и восстановление исходного текста потребует тогда двух проходов декодирования.