URL-кодирование параметров ссылок¶
URL-кодирование (процентное кодирование, percent-encoding) — это механизм представления информации в универсальном идентификаторе ресурса (URI) путём замены определённых символов на последовательность из знака процента (%) и двух шестнадцатеричных цифр, обозначающих байтовое значение символа в кодировке UTF-8. Данный метод является стандартом де-факто для передачи данных в составе URL-адресов и применяется для обеспечения совместимости адресов с протоколами передачи данных и корректной интерпретации запросов серверами.
¶Назначение и причины использования
Основной причиной введения URL-кодирования является ограниченный набор допустимых символов в структуре URI. Согласно стандарту RFC 3986, в URL разрешено использовать только латинские буквы (A–Z, a–z), цифры (0–9) и ограниченный набор служебных символов (-, _, ., ~). Все остальные символы, включая кириллицу, пробелы, знаки препинания и спецсимволы, должны быть закодированы.
Проблемы, решаемые кодированием:
- Недопустимые символы: пробелы и национальные алфавиты не входят в базовый набор ASCII и не могут быть переданы напрямую.
- Конфликт со служебными символами: символы
&,=,?,#имеют специальное значение в структуре URL (разделители параметров, якоря). Если они встречаются в значении параметра, их необходимо закодировать, чтобы сервер не интерпретировал их как часть синтаксиса запроса. - Безопасность передачи: кодирование предотвращает некорректную обработку данных на промежуточных узлах сети, которые могут интерпретировать «сырые» байты как управляющие последовательности.
¶Механизм кодирования
Процесс кодирования заключается в следующем:
- Символ преобразуется в последовательность байтов в кодировке UTF-8.
- Каждый байт, не относящийся к разрешённым символам, заменяется на знак
%, за которым следуют две шестнадцатеричные цифры (в верхнем регистре).
Например, пробел (код 0x20) кодируется как %20, символ ё в UTF-8 занимает два байта (0xD1 0x91) и кодируется как %D1%91. Кириллическая буква «А» (U+0410) в UTF-8 представлена байтами 0xD0 0x90, следовательно, её закодированный вид — %D0%90.
¶Таблица соответствия распространённых символов
| Символ | Закодированный вид | Примечание |
|---|---|---|
| Пробел | %20 | В теле формы может заменяться на + |
& | %26 | Разделитель параметров |
= | %3D | Разделитель ключа и значения |
? | %3F | Начало строки запроса |
# | %23 | Якорь |
/ | %2F | Разделитель пути |
% | %25 | Сам символ процента |
ё | %D1%91 | Пример многобайтовой кодировки |
¶Кодирование пробелов: %20 или +
Существует два стандарта кодирования пробелов. В каноническом URL-кодировании (RFC 3986) пробел заменяется на %20. Однако в формате application/x-www-form-urlencoded, используемом при отправке HTML-форм методом POST и в некоторых реализациях строк запроса, пробел кодируется знаком плюс (+). Это различие часто приводит к ошибкам: сервер, ожидающий стандарт RFC 3986, может воспринять символ + как литеральный плюс, а не как пробел.
¶Применение на практике
¶Клиентская сторона
В JavaScript для кодирования параметров используются функции:
encodeURIComponent()— кодирует строку для использования в качестве значения параметра, обрабатывая все символы, кромеA–Z a–z 0–9 - _ . ! ~ * ' ( ).encodeURI()— кодирует весь URL, сохраняя служебные символы (:,/,?,&), что делает её непригодной для кодирования отдельных параметров.
¶Серверная сторона
Все современные веб-фреймворки автоматически декодируют входящие параметры запроса. Например, в PHP это происходит через суперглобальные массивы $_GET и $_POST, в Python (Django/Flask) — через объект request.args. При этом важно помнить, что сервер декодирует параметры один раз; повторное декодирование уже декодированной строки может привести к ошибкам, особенно если исходные данные содержали символ %.
¶Пример
Исходная строка запроса: `` https://example.com/search?query=кошка&page=1 ` После кодирования параметра query: ` https://example.com/search?query=%D0%BA%D0%BE%D1%88%D0%BA%D0%B0&page=1 ``
¶Двойное кодирование и ошибки
Типичная ошибка — двойное кодирование, когда закодированная строка кодируется повторно. Например, значение %D0%BA при повторном кодировании превращается в %25D0%25BA. Сервер декодирует первый уровень и получает строку %D0%BA, которая отображается пользователю как литеральный текст, а не как символ «к». Обратная проблема — отсутствие кодирования — приводит к обрезанию параметров при встрече с символом & или #.
¶Стандарты и спецификации
Основные документы, регламентирующие URL-кодирование:
- RFC 3986 — актуальный стандарт URI, определяющий синтаксис и правила процентного кодирования.
- WHATWG URL Standard — современная спецификация, используемая браузерами, которая уточняет обработку нестандартных символов.
- RFC 1866 (HTML 2.0) — ввёл формат application/x-www-form-urlencoded с кодированием пробелов как
+.
Несмотря на наличие стандартов, на практике встречаются расхождения в реализации: одни библиотеки кодируют символ ~, другие оставляют его неизменным, некоторые не кодируют символ !. Для обеспечения совместимости рекомендуется использовать встроенные функции языка программирования, а не писать собственные реализации.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →

