Руководство по URL-кодированию: зачем и как кодировать URL
Задумывались, почему пробелы в URL превращаются в %20, а амперсанды — в %26? URL-кодирование (также называемое процентным кодированием) преобразует символы, небезопасные для URL, в формат, понятный веб-серверам.
Зачем нужно URL-кодирование
URL могут содержать только ограниченный набор ASCII-символов. Специальные символы, пробелы и не-ASCII текст нуждаются в кодировании для безопасной передачи. Без кодирования URL ломаются непредсказуемым образом — пробел может обрезать URL, а амперсанд может быть ошибочно принят за разделитель параметров.
Попробуйте наш URL-кодировщик/декодировщик, чтобы увидеть, как любой текст преобразуется при кодировании для URL.
Какие символы нужно кодировать?
Безопасные символы (кодирование не требуется)
Буквы (A-Z, a-z), цифры (0-9) и эти символы: -, _, ., ~
Зарезервированные символы (кодировать при использовании как данные)
| Символ | Закодированный | Назначение в URL |
|---|---|---|
: | %3A | Разделитель схемы |
/ | %2F | Разделитель пути |
? | %3F | Начало строки запроса |
# | %23 | Идентификатор фрагмента |
& | %26 | Разделитель параметров |
= | %3D | Разделитель ключ-значение |
+ | %2B | Часто обозначает пробел |
@ | %40 | Разделитель информации о пользователе |
% | %25 | Индикатор кодирования |
Всегда кодировать
Пробелы (%20), не-ASCII символы (байты UTF-8 кодируются), и любой символ за пределами безопасного набора.
URL-кодирование на практике
Параметры запроса
Самый распространённый случай использования. При построении поисковых URL или API-запросов:
https://api.example.com/search?q=hello%20world&lang=en
Данные форм
HTML-формы с method="GET" автоматически URL-кодируют значения полей. Пробелы становятся + при форм-кодировании (немного отличается от процентного кодирования).
Сегменты пути
Имена файлов и идентификаторы ресурсов в путях URL тоже нуждаются в кодировании. Файл с именем my report.pdf становится my%20report.pdf в URL.
Кодирование на разных языках
JavaScript:
encodeURIComponent('hello world & more')
// "hello%20world%20%26%20more"
decodeURIComponent('hello%20world')
// "hello world"
Python:
from urllib.parse import quote, unquote
quote('hello world & more')
# 'hello%20world%20%26%20more'
Типичные ошибки
- Двойное кодирование — кодирование уже закодированного URL превращает
%20в%2520 - Использование
encodeURIвместоencodeURIComponent—encodeURIпропускает зарезервированные символы, важные в значениях параметров запроса - Некодирование знака
+— в URL+может означать пробел. Кодируйте буквальные плюсы как%2B - Забывание о не-ASCII символах — Unicode-символы сначала кодируются в UTF-8, затем процентно кодируются
Часто задаваемые вопросы
В чём разница между encodeURI и encodeURIComponent?
encodeURI кодирует полный URL, пропуская символы вроде :, /, ?, #. encodeURIComponent кодирует всё, кроме незарезервированных символов — используйте его для отдельных значений параметров запроса.
Почему пробелы иногда становятся + а иногда %20?
Форм-кодирование (application/x-www-form-urlencoded) использует + для пробелов. Стандартное процентное кодирование использует %20. Оба варианта валидны в разных контекстах.
Связанные ресурсы
- Base64-кодирование: объяснение — ещё одна важная схема кодирования
- Паттерны проектирования JSON API — создание API с правильной обработкой кодирования
- URL-кодировщик/декодировщик — кодируйте и декодируйте URL мгновенно
- Base64-кодировщик — кодируйте данные в формате Base64