Процентное кодирование в URL: что на самом деле значат %20, + и %2F
Процентное кодирование записывает символ, который URL не может безопасно передать, как знак процента и следующее за ним значение байта в шестнадцатеричной системе. Пробел становится %20, амперсанд — %26, а косая черта — %2F. Кодирование защищает структуру ссылки, потому что такие символы, как & и =, разделяют части строки запроса.
Какие символы можно оставить как есть
Стандарт URI (RFC 3986), на котором построены адреса, не требует кодировать латинские буквы от A до Z и от a до z, цифры и четыре знака: - _ . ~. Остальные символы в адресе выполняют свою функцию. Двоеточие отделяет схему от остальной части, косая черта разделяет части пути, знак вопроса начинает запрос, решётка начинает фрагмент, а & и = делят запрос на имена и значения. Символ, который выполняет функцию, нужно закодировать, если вы хотите передать его как данные, а не как часть структуры.
Поэтому один и тот же символ в одном месте кодируется, а в другом нет. В значении параметра запроса амперсанд должен быть %26, иначе ссылка разделится не в том месте. В пути ссылки он обычный символ.
Буквы, отличные от латиницы
Буквы вне базовой латиницы кодируются как байты UTF-8, и каждый байт записывается как процентный код. Буква é в слове café — это два байта C3 и A9, поэтому она становится %C3%A9, а всё слово — caf%C3%A9.
Простой пример помогает понять правила. Текст a b&c=d/é, закодированный как компонент, превращается в a%20b%26c%3Dd%2F%C3%A9. Кодируется каждый символ, который не является безопасной буквой, цифрой или знаком: пробел, амперсанд, знак равенства, косая черта и буква с диакритикой.
Компонент или весь URL
Существуют два вида кодирования, и у каждого есть своя задача. Кодирование компонента считает все зарезервированные символы данными. Используйте его для одного значения, например для поискового запроса или имени файла внутри ссылки. Если закодировать «rock & roll» как поисковый запрос, получится rock%20%26%20roll, и амперсанд останется внутри значения.
Кодирование всего URL сохраняет структуру. Если закодировать https://example.com/a b, получится https://example.com/a%20b: косые черты и двоеточие остаются на месте. Используйте этот вариант для полного адреса, который нужно привести к корректному виду, но не для значения, которое вставляется внутрь ссылки.
В инструменте для URL есть настройки «Компонент» и «Полный URL» именно по этой причине. Декодирование полного URL также сохраняет экранированные структурные символы, такие как %26 и %3D, поэтому ссылка продолжает работать после декодирования.
Плюсы и данные форм
Веб-формы используют другое соглашение. Когда форма отправляется как данные формы, пробел записывается как +, а не как %20. Сам знак плюс в этом случае записывается как %2B. Так фраза C++ tips в данных формы становится C%2B%2B+tips, а при обычном кодировании компонента — C%2B%2B%20tips.
С декодированием та же разница. В строке запроса + обычно означает пробел. В пути ссылки + — это знак плюс. Инструмент считает + пробелом только тогда, когда отмечена опция «Использовать + для пробелов (данные формы)», поэтому оставляйте её выключенной для путей и для значений, где плюс настоящий.
Как читать длинную строку запроса
Ссылка часто передаёт свои настройки после знака вопроса. Вот пример:
https://shop.example/search?q=red%20shirt&size=M&tag=summer%2Bsale
После декодирования видно, что поиск ведётся по запросу red shirt, размер — M, а тег — summer+sale. %2B остаётся знаком плюс, потому что был закодирован. Вставьте ссылку в инструмент для URL, и он выведет каждое имя и значение после декодирования, так что длинную ссылку легко прочитать. Если нужен только короткий адрес без служебных параметров отслеживания, сначала очистите ссылку.
Двойное кодирование
Самая частая ошибка — закодировать значение дважды. Повторное кодирование текста %20 даёт %2520, потому что сам знак процента кодируется как %25. Страница ищет в значении буквальную строку %20, и поиск или страница не совпадают. Декодируйте ссылку один раз, проверьте результат и кодируйте значение только тогда, когда это действительно нужно.
Повреждённые экранированные последовательности
За знаком процента должны следовать две шестнадцатеричные цифры, а для букв с диакритикой цифры должны образовывать корректную последовательность UTF-8. Ссылка, которую обрезали, или случайный знак процента в тексте могут оставить повреждённую последовательность, например %E0%A4%A. Инструмент декодирует то, что может, оставляет повреждённые байты в исходном виде и сообщает, сколько фрагментов не удалось декодировать. Он не останавливается на первой ошибке.
Особые случаи
- Пробелы в ссылке, введённой вручную. Адресная строка браузера кодирует пробелы сама, но ссылка, скопированная в документ, может содержать обычные пробелы. Закодируйте их, прежде чем отправить ссылку дальше.
- Доменные имена на других языках. Для них используется отдельная система — punycode, и кодирование пути или запроса не меняет имя хоста.
- Половина эмодзи. При неудачном копировании может остаться одна половина суррогатной пары, которую нельзя закодировать. Инструмент заменяет её символом замены и сообщает об этом.
- Base64 в ссылках. Значение Base64 в ссылке подчиняется своим правилам: вместо + и / используются - и _. См. Base64 простыми словами.
Как сделать это в fixmint
- Вставьте текст или ссылку в поле «Текст или URL».
- Выберите «Кодировать» или «Декодировать», затем «Компонент» для одного значения или «Полный URL» для всего адреса.
- Отметьте «Использовать + для пробелов (данные формы)» для ссылок, скопированных из веб-формы.
- Для ссылки смотрите раздел «Параметры запроса, декодированные», чтобы увидеть каждое имя и значение.
- Скопируйте результат.
Краткие ответы
Что означает %20?
Пробел. Его значение байта в шестнадцатеричной системе — 20.
Почему в ссылке стоит +, а не %20?
Скорее всего, ссылка пришла из формы, где + обозначает пробел. Опция «Использовать + для пробелов (данные формы)» декодирует его правильно.
Почему в ссылке я вижу %2520?
Значение закодировали дважды. Знак процента из %20 закодировали повторно как %25. Декодируйте один раз, чтобы получить %20, и ещё раз, чтобы получить пробел.
Переведено с помощью ИИ с Английский оригинал.
Комментарии
Комментариев пока нет. Будьте первым.


