Как закодировать строку для URL
- Введите или вставьте текст в поле Текст или URL. Результат обновляется по мере ввода.
- Выберите режим в поле Кодирование:
- Компонент (encodeURIComponent): для одного значения параметра, поля формы или сегмента пути.
- Полный URL (encodeURI): для целого URL, в котором есть пробелы или не-ASCII символы.
- Данные формы (пробел как +): для тел
application/x-www-form-urlencodedи query-строк, собранных так, как это делают HTML-формы. - Все символы: закодировать все байты, включая буквы, чтобы проверить декодер.
- Оставьте в поле Кодировка UTF-8, если принимающая система не ждёт старую кодировку.
- Отметьте Каждую строку отдельно, чтобы закодировать список значений за раз, затем нажмите Скопировать результат. Поменять местами отправляет результат в декодер, чтобы проверить преобразование туда и обратно.
Если на входе полный URL, таблица под полями разбирает его на схему, хост, путь, отдельные параметры запроса и фрагмент.
encodeURIComponent, encodeURI и кодирование форм
Один и тот же ввод, a b&c=d/é?#+, в трёх распространённых стилях:
| Режим | Результат | Для чего |
|---|---|---|
Компонент (encodeURIComponent) | a%20b%26c%3Dd%2F%C3%A9%3F%23%2B | одно значение внутри URL |
Полный URL (encodeURI) | a%20b&c=d/%C3%A9?#+ | целый URL, структура которого уже правильная |
Данные формы (URLSearchParams) | a+b%26c%3Dd%2F%C3%A9%3F%23%2B | отправка HTML-форм, многие библиотеки для query-строк |
Компонент оставляет без экранирования только A–Z a–z 0–9 - _ . ! ~ * ' ( ). Полный URL сохраняет ещё и ; / ? : @ & = + $ , #, то есть символы, которые задают структуру URL, поэтому защитить значение с ними он не может. Данные формы оставляют только буквы, цифры и - _ . *, а пробелы пишут как +.
Классическая ошибка: URL собирают в режиме Полный URL. Тогда в ?q=C++ & Go остаются + и &, и сервер получает q=C плюс лишний параметр. Закодируйте значение в режиме Компонент: ?q=C%2B%2B%20%26%20Go.
Пробелы, плюсы и другие проблемные символы
| Символ | В закодированном виде | Почему это важно |
|---|---|---|
| пробел | %20 или + | + означает пробел только в query-строках и телах форм |
+ | %2B | без кодирования многие серверы превращают его в пробел: +49 30 1234567 становится 49 30 1234567 |
& | %26 | начинает новый параметр запроса |
= | %3D | отделяет имя от значения; им заканчивается стандартный Base64 |
/ | %2F | делит путь на сегменты; некоторые серверы отклоняют %2F в пути |
# | %23 | начинает фрагмент, который никогда не отправляется на сервер |
% | %25 | его самого нужно кодировать, иначе декодер увидит битую escape-последовательность |
€ | %E2%82%AC | три байта UTF-8 дают три escape-последовательности |
На +, / и = чаще всего спотыкается Base64 в URL. Либо закодируйте его как компонент, либо перейдите на Base64URL, где этих символов нет.
Кодировки, отличные от UTF-8
Percent-encoding работает с байтами, поэтому результат зависит от кодировки. é даёт %C3%A9 в UTF-8 и %E9 в Windows-1252 или ISO-8859-1. Современные браузеры и API используют UTF-8, но старые PHP-приложения, некоторые платёжные шлюзы и устаревшие интранет-системы до сих пор ждут Latin-1 или Windows-1252, а японские сайты иногда ждут Shift_JIS. Выберите подходящую в поле Кодировка. Символ, которого нет в выбранной кодировке, представить нельзя, так что проверьте на них результат.
URL-кодирование в коде
encodeURIComponent("a b&c") // "a%20b%26c"
new URLSearchParams({ q: "C++ & Go" }).toString() // "q=C%2B%2B+%26+Go"
from urllib.parse import quote, quote_plus, urlencode
quote("/files/a b.txt") # '/files/a%20b.txt' (keeps / by default)
quote("/files/a b.txt", safe="") # '%2Ffiles%2Fa%20b.txt'
quote_plus("a b&c") # 'a+b%26c'
urlencode({"q": "C++ & Go"}) # 'q=C%2B%2B+%26+Go'
quote в Python не трогает /, если не передать safe=""; при кодировании значения это часто становится сюрпризом. В других языках: rawurlencode в PHP даёт %20, а urlencode даёт +; URLEncoder.encode в Java кодирует по правилам HTML-форм, с +; в Go есть url.PathEscape (%20) и url.QueryEscape (+). encodeURIComponent не трогает ! ' ( ) *; для строгого вывода по RFC 3986 замените их отдельно:
const strict = s => encodeURIComponent(s).replace(/[!'()*]/g,
c => "%" + c.charCodeAt(0).toString(16).toUpperCase());
Подробнее о JavaScript рассказывает страница Base64 в JavaScript. Чтобы всё это раскодировать обратно, используйте URL decode.
Вопросы и ответы
Что такое URL-кодирование?
URL-кодирование, или percent-encoding, заменяет символы, которые в URL запрещены или имеют особый смысл, на % и две hex-цифры каждого байта. Например: пробел → %20, & → %26, é в UTF-8 → %C3%A9.
Как кодировать пробел в URL: %20 или +?
%20 работает везде. + означает пробел только в query-строках и телах форм, которые следуют правилам кодирования форм; в пути это буквальный плюс. Если сомневаетесь, используйте %20.
Нужно ли кодировать URL целиком?
Нет, кодируйте каждое значение перед вставкой. Если закодировать весь URL в режиме Компонент, экранируются и :, /, ?, &, и адрес сломается. Режим Полный URL оставляет эти структурные символы и исправляет только пробелы и не-ASCII текст.
Откуда в закодированной строке %25?
%25 означает закодированный знак процента. Значит, ввод уже был закодирован и его закодировали повторно: a%20b превращается в a%2520b. Кодируйте исходный текст ровно один раз.
Hex в percent-encoding писать прописными или строчными?
RFC 3986 считает %2F и %2f одинаковыми и рекомендует прописные. Отмечайте Hex в нижнем регистре только чтобы совпасть с системой, которая выдаёт строчные, например при сравнении подписей.