URL-кодування
Екранувати рядок для URL або розкодувати назад
Дані не залишають ваш браузер
Цей інструмент повністю працює на вашому пристрої: обчислення виконує JavaScript у вкладці. Ми не надсилаємо введений текст на сервер, не зберігаємо і не логуємо його. Можете сміливо працювати з робочими даними - і навіть відключити інтернет після завантаження сторінки.
Що таке URL-кодування
В адресі можна використовувати лише обмежений набір символів. Усе інше - пробіли, кирилиця, &, ?, # - треба екранувати: замінити на % і шістнадцятковий код байта. Це і є percent-encoding, або URL-кодування.
Без нього адреса просто ламається: пробіл обриває посилання, & починає новий параметр, а # відрізає все після себе.
Два різні кодування
Це найчастіша плутанина, і саме тому у формі вище є перемикач.
- Компонент (
encodeURIComponent) екранує усе, включно з/,?,&,=. Використовуйте для значення одного параметра. - Повний URL (
encodeURI) залишає структурні символи недоторканими, бо інакше адреса перестане бути адресою. Використовуйте, коли кодуєте посилання цілком.
// Значення параметра: & всередині має бути екранований
$value = rawurlencode('Тарас & Ко'); // %D0%A2%D0%B0%D1%80%D0%B0%D1%81%20%26%20%D0%9A%D0%BE
// Інакше цей & розірве query і створить зайвий параметр
$url = "https://example.com/search?q={$value}&page=2";
urlencode vs rawurlencode у PHP
У PHP є дві функції, і різниця між ними - один символ:
urlencode('привіт світ'); // ...+... пробіл стає плюсом
rawurlencode('привіт світ'); // ...%20... пробіл стає %20
urlencode() реалізує старий формат HTML-форм (application/x-www-form-urlencoded), де пробіл - це +. rawurlencode() відповідає RFC 3986 - сучасному стандарту адрес.
Практичне правило: для частин шляху завжди rawurlencode(), бо + у шляху означає літеральний плюс, а не пробіл. Для query-параметрів підходять обидві, але rawurlencode() передбачуваніша.
У Laravel
// Хелпери самі кодують параметри - вручну нічого робити не треба
route('search', ['q' => 'привіт світ']);
url()->query('/jobs', ['city' => 'Київ', 'level' => 'middle']);
// Http-клієнт теж кодує query сам
Http::get('https://api.example.com/search', [
'q' => 'Тарас & Ко',
]);
Подвійне кодування - типова помилка. Якщо передати в route() вже закодований рядок, %20 перетвориться на %2520. Кодуйте один раз, у найостаннішу чергу.
Кирилиця
Українські літери в UTF-8 займають два байти, тому одна літера дає дві percent-послідовності: і - це %D1%96. Та сама байтова природа стоїть за Base64. Довгі адреси українською виглядають страшно, але це нормально і коректно - браузери показують їх користувачу вже розкодованими.
- Де виконується
- у браузері
- Категорія
- Кодування