Открыть сервис

URL-кодирование параметров ссылок

URL-кодирование (процентное кодирование, percent-encoding) — это механизм представления информации в универсальном идентификаторе ресурса (URI) путём замены определённых символов на последовательность из знака процента (%) и двух шестнадцатеричных цифр, обозначающих байтовое значение символа в кодировке UTF-8. Данный метод является стандартом де-факто для передачи данных в составе URL-адресов и применяется для обеспечения совместимости адресов с протоколами передачи данных и корректной интерпретации запросов серверами.

Назначение и причины использования

Основной причиной введения URL-кодирования является ограниченный набор допустимых символов в структуре URI. Согласно стандарту RFC 3986, в URL разрешено использовать только латинские буквы (A–Z, a–z), цифры (0–9) и ограниченный набор служебных символов (-, _, ., ~). Все остальные символы, включая кириллицу, пробелы, знаки препинания и спецсимволы, должны быть закодированы.

Проблемы, решаемые кодированием:

  • Недопустимые символы: пробелы и национальные алфавиты не входят в базовый набор ASCII и не могут быть переданы напрямую.
  • Конфликт со служебными символами: символы &, =, ?, # имеют специальное значение в структуре URL (разделители параметров, якоря). Если они встречаются в значении параметра, их необходимо закодировать, чтобы сервер не интерпретировал их как часть синтаксиса запроса.
  • Безопасность передачи: кодирование предотвращает некорректную обработку данных на промежуточных узлах сети, которые могут интерпретировать «сырые» байты как управляющие последовательности.

Механизм кодирования

Процесс кодирования заключается в следующем:

  1. Символ преобразуется в последовательность байтов в кодировке UTF-8.
  2. Каждый байт, не относящийся к разрешённым символам, заменяется на знак %, за которым следуют две шестнадцатеричные цифры (в верхнем регистре).

Например, пробел (код 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 →