URL-адреса має суворий синтаксис: символи на кшталт пробілу, &, ?, # чи кирилиці мають спеціальне значення або взагалі недопустимі в «сирому» вигляді. Percent-encoding (URL Encode) замінює такі символи на послідовність %XX, де XX — шістнадцятковий код байта.
Як це працює
Кожен небезпечний байт замінюється на знак відсотка та двозначний шістнадцятковий код. Наприклад, пробіл стає %20, а символ & — %26. Символи Unicode (наприклад, кирилиця) спершу кодуються в UTF-8, а вже потім кожен байт результату записується як %XX.
encodeURIComponent проти encodeURI
У JavaScript є дві функції з різною поведінкою. encodeURIComponent кодує майже всі спецсимволи, включно з &, ?, =, / — її використовують для окремих значень параметрів. encodeURI залишає символи, які мають структурне значення в URL (:, /, ?, &, #), і призначена для кодування цілої адреси.
Типова помилка
Якщо закодувати весь query-рядок через encodeURIComponent, символи & і =, що розділяють параметри, теж перетворяться на %26 і %3D — і сервер отримає один великий параметр замість кількох. Кодувати потрібно значення параметрів окремо, а не весь рядок цілком.
Коли це потрібно
- Передача тексту з пробілами чи спецсимволами як частини query-параметра.
- Формування посилань із динамічними значеннями (пошукові запити, ідентифікатори).
- Діагностика: декодування адреси, щоб побачити, які дані реально в ній закодовані.
Edge case: подвійне кодування
Якщо рядок, що вже закодований у percent-encoding, закодувати ще раз, символ % сам перетвориться на %25 — і результат стане нечитабельним подвійно закодованим сміттям (%20 → %2520). Це трапляється, коли фреймворк автоматично кодує URL, а розробник додатково викликає encodeURIComponent вручну. Ознака проблеми — послідовності на кшталт %25XX у декодованому результаті.