Що таке відсоткове кодування
Навіщо воно
Адреса може складатися лише з невеликого набору знаків ASCII. Усе інше — кирилиця, пробіл, лапки, емодзі — передається як послідовність «%» і двох шістнадцяткових цифр на кожен байт. Тому ламінат в адресі виглядає як %D0%BB%D0%B0%D0%BC%D1%96%D0%BD%D0%B0%D1%82: вісім літер, по два байти на кожну.
Три набори, а не один
Частина адреси екранує все, крім літер, цифр і -._~. Це набір для одного значення: коли параметр містить /, & чи ?, вони мають стати екрануванням, інакше розірвуть адресу, у яку їх вставляють.
Повна адреса лишає на місці знаки, що тримають посилання вкупі: :, /, ?, #, &, =. Ним лагодять готове посилання, у якому є пробіли або кирилиця. Значення всередині нього ним кодувати не можна — воно лишить роздільники недоторканими.
Поле форми — це правило, за яким браузер надсилає форму: пробіл стає +. Поза рядком запиту + означає звичайний плюс, тому цей набір і винесено в окремий пункт, а не вгадується з тексту.
Зворотний напрям
Розкодування читає кожну послідовність %XX як байт і збирає з байтів текст. Якщо в рядку є %, за яким немає двох шістнадцяткових знаків, розкодовувати нема чого — це просто текст із відсотком, і сторінка каже про це прямо, а не викидає знак мовчки.
Часті питання про кодування URL
Чому та сама літера дає два екранування?
Бо в UTF-8 кириличну літеру записано двома байтами, а екранування описує один байт. к — це %D0%BA. Латинська літера займає один байт і взагалі не потребує екранування.
Пробіл — це %20 чи +?
%20 в адресі, + у полі форми. Обидва читаються як пробіл там, де вони доречні, але + у шляху лишиться плюсом.
Чи можна вставити кирилицю прямо в адресу?
Браузер покаже її читабельно, а надішле все одно закодованою. Проблема починається, коли посилання копіюють: у листі чи повідомленні воно розгортається у довгий рядок із відсотків.
Я розкодував, а вийшли кракозябри
Текст кодували не в UTF-8 — найчастіше в windows-1251. Сторінка не вгадує кодування: вона каже, що байти не читаються як UTF-8, і зупиняється.
Скільки разів можна кодувати?
Скільки завгодно, і кожен раз % стає %25. Подвійне кодування — звичайна причина, чому посилання не відкривається: розкодуйте двічі й побачите, що всередині.