Загрузка...
Загрузка...
Руководство по URL encoding: encodeURIComponent, encodeURI, разница между ними. Спецсимволы, пробелы, кириллица — когда и как кодировать.
Бесплатные онлайн-инструменты по теме статьи
Полное руководство по Base64: принцип работы, применение в вебе, плюсы и минусы. Кодирование изображений, Data URI, ограничения.
УтилитыПолный список размеров favicon для всех платформ. Apple Touch Icon, Android, Windows, PWA. Таблицы и разметка для полной совместимости.
УтилитыПолное руководство по favicon. Форматы ICO, PNG, SVG. Разметка в HTML, поддержка браузеров, генерация. Практические рекомендации для веб-разработчиков.
УтилитыПрактическое руководство по оптимизации SVG: удаление метаданных, упрощение путей, минификация. Инструменты и приёмы для веб-разработчиков.
Поделитесь с коллегами или изучите другие материалы блога
URL может содержать только ограниченный набор символов (буквы, цифры, -, _, ., ~ и несколько других). Остальные символы — пробелы, кириллица, спецсимволы — должны быть закодированы в виде %XX, где XX — шестнадцатеричный код символа. В этой статье разберём, когда и как применять кодирование, чем отличаются encodeURIComponent и encodeURI, и типичные ошибки.
Для кодирования и декодирования URL используйте URL Encoder на reChecker.
Пробел в URL недопустим. Он кодируется как %20 или + (в application/x-www-form-urlencoded). Символы вроде &, =, ?, # имеют специальное значение — их кодирование предотвращает некорректный разбор URL.
URL исторически основан на ASCII. Символы вне ASCII (кириллица, иероглифы, диакритики) кодируются в UTF-8, а каждый байт — в %XX:
"Привет" → %D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82
Современные браузеры отображают Unicode в адресной строке, но при отправке запросов используют percent-encoded форму.
Символы !$&'()*+,;=:@ в некоторых контекстах допустимы без кодирования (RFC 3986), но для надёжности их часто кодируют при использовании в query-параметрах.
В JavaScript есть две функции. Разница — в наборе кодируемых символов.
Кодирует почти всё, кроме A-Z a-z 0-9 - _ . ! ~ * ' ( ). Предназначена для значений параметров, а не для целого URL.
encodeURIComponent('a & b = c');
// "a%20%26%20b%20%3D%20c"
encodeURIComponent('Привет');
// "%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82"
Используйте для каждого параметра отдельно:
const query = 'поиск';
const url = `https://example.com/search?q=${encodeURIComponent(query)}`;
// https://example.com/search?q=%D0%BF%D0%BE%D0%B8%D1%81%D0%BA
Кодирует только символы, недопустимые в URL, но не трогает ; , / ? : @ & = + $ #. Предназначена для целого URL, а не для частей.
encodeURI('https://example.com/path?name=Иван');
// "https://example.com/path?name=%D0%98%D0%B2%D0%B0%D0%BD"
Если применить encodeURIComponent к целому URL, сломаются слэши и протокол:
encodeURIComponent('https://example.com/path');
// "https%3A%2F%2Fexample.com%2Fpath" — невалидный URL
| Функция | Кодирует | Применение |
|---|---|---|
| encodeURIComponent | Всё кроме букв, цифр, -_.!~*'() | Значения query-параметров, fragment |
| encodeURI | Только недопустимые в URL | Целый URL (path + query уже сформированы) |
decodeURIComponent('%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82');
// "Привет"
decodeURI('https://example.com/path?name=%D0%98%D0%B2%D0%B0%D0%BD');
// "https://example.com/path?name=Иван"
Используйте decodeURIComponent для значений параметров. decodeURI — для целого URL.
При отправке форм с Content-Type: application/x-www-form-urlencoded пробелы кодируются как +, а не %20. При парсинге на сервере + декодируется в пробел. В encodeURIComponent пробел даёт %20. Для совместимости с формами можно заменить:
function encodeFormValue(str) {
return encodeURIComponent(str).replace(/%20/g, '+');
}
В большинстве современных API и fetch с URLSearchParams используется %20, и серверы корректно обрабатывают оба варианта.
// Неправильно
const url = encodeURIComponent('https://example.com/search?q=test');
// Правильно
const base = 'https://example.com/search';
const url = `${base}?q=${encodeURIComponent('test')}`;
Если значение уже закодировано, повторное кодирование приведёт к некорректному результату:
encodeURIComponent('%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82');
// "%25D0%259F%25D1%2580%25D0%25B8%25D0%25B2%25D0%25B5%25D1%2582" — двойное кодирование
Проверяйте источник данных. При получении из другого API значение может быть уже закодировано.
Имена параметров тоже должны быть закодированы, если содержат спецсимволы:
const params = { 'user name': 'Иван' };
const query = Object.entries(params)
.map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`)
.join('&');
// user%20name=%D0%98%D0%B2%D0%B0%D0%BD
Современный API для работы с query-строками автоматически кодирует значения:
const params = new URLSearchParams();
params.set('q', 'поиск');
params.set('page', '1');
params.toString();
// "q=%D0%BF%D0%BE%D0%B8%D1%81%D0%BA&page=1"
Рекомендуется использовать URLSearchParams вместо ручной конкатенации — меньше шансов ошибиться.
encodeURIComponent или URLSearchParamsПравильное кодирование URL предотвращает ошибки при передаче кириллицы, пробелов и спецсимволов. Инструмент URL Encoder помогает быстро проверить и сгенерировать корректные строки.
В path-сегментах допустимы буквы, цифры и ограниченный набор символов: -, ., _, ~. Слэш / разделяет сегменты и не кодируется внутри path. При формировании динамических путей (например, из названия файла) кодируйте каждый сегмент:
const filename = 'документ (1).pdf';
const path = `/files/${encodeURIComponent(filename)}`;
rawurlencode() для path и значений параметров (пробел → %20), urlencode() для form data (пробел → +)urllib.parse.quote() с safe для указания не кодируемых символовURLEncoder.encode() — для form data; для path используйте URI или URL с корректным разборомПроверка результата через URL Encoder на reChecker помогает убедиться в корректности при работе с разными стеками.
Домены с кириллицей (например, сайт.рф) кодируются в Punycode (xn--80aswg.xn--p1ai). Браузеры отображают Unicode, но при разрешении DNS и в заголовках используется Punycode. Для кодирования/декодирования Punycode в JavaScript применяют url.domainToASCII() и url.domainToUnicode().
При передаче параметров в fetch используйте URLSearchParams или вручную кодируйте значения:
const params = { q: 'поиск', page: 1 };
const query = new URLSearchParams(params).toString();
fetch(`/api/search?${query}`);
Для POST с application/x-www-form-urlencoded тело запроса тоже должно быть закодировано. URLSearchParams при передаче в body делает это автоматически.
Серверы и фреймворки обычно декодируют параметры автоматически. Проверьте настройки: некоторые прокси или CDN могут изменять кодировку. При ручном парсинге query-строки используйте встроенные парсеры (URL, URLSearchParams) — они корректно обрабатывают edge cases.