Вступление: Почему URL-кодирование — это не скучная теория, а спасение вашего приложения
Представьте ситуацию: вы пишете веб-приложение на JavaScript, пользователь вводит поисковый запрос «JavaScript & Node.js: лучшие практики». Вы передаёте этот текст в URL как параметр GET-запроса. Открываете консоль браузера — а там ошибка. Или, что ещё хуже, — запрос уходит, но сервер его не понимает, и вместо результатов поиска пользователь видит пустую страницу.
Знакомо? Если да — эта статья для вас. Если нет — она всё равно для вас, потому что рано или поздно вы с этим столкнётесь. Тема кодирования URL в JavaScript — один из самых популярных вопросов на Stack Overflow (десятки тысяч просмотров), и неспроста. Это та мелочь, которая отличает профессионального разработчика от новичка.
Сегодня мы разберём три способа кодирования URL в JavaScript, научимся выбирать правильный инструмент для каждой задачи и рассмотрим реальные примеры из жизни веб-разработчика. Поехали!
Что такое URL-кодирование и зачем оно нужно
Прежде чем писать код, давайте разберёмся с теорией. URL (Uniform Resource Locator) имеет строгую структуру. В нём разрешены только определённые символы: латинские буквы, цифры и некоторые спецсимволы (-, _, ., ~). А вот пробелы, кириллица, символы &, ?, # и другие — под запретом.
Когда мы пытаемся передать такие символы в URL, браузер или сервер могут неправильно интерпретировать запрос. Например, символ & в строке запроса отделяет параметры друг от друга. Если он попадёт внутрь значения параметра — логика сломается.
Решение — URL-кодирование (процентное кодирование). Запрещённые символы заменяются на последовательность вида %XX, где XX — шестнадцатеричный код символа в кодировке UTF-8. Например, пробел становится %20, а кириллическая «а» — %D0%B0.
В JavaScript для этого есть три встроенных механизма. Давайте разберём каждый.
Способ 1: encodeURI() — для целых URL
Функция encodeURI() предназначена для кодирования полного URL. Она заменяет все символы, кроме тех, что являются частью синтаксиса URI: :, /, ?, #, &, = и других.
Синтаксис
encodeURI(uri)
Пример
const url = "https://pythonlib.ru/search?q=JavaScript & Node.js";
const encoded = encodeURI(url);
console.log(encoded);
// Результат: "https://pythonlib.ru/search?q=JavaScript%20&%20Node.js"
Обратите внимание: encodeURI() закодировала пробелы, но не тронула символы &, ? и =. Это правильно для целого URL, но опасно для параметров. Если бы в нашем запросе был символ & внутри значения параметра, он бы остался как есть и разорвал бы строку запроса.
Когда использовать
- Когда нужно закодировать весь URL целиком (например, для передачи в
window.location) - Когда URL не содержит пользовательских данных с потенциально опасными символами
Когда НЕ использовать
- Для кодирования отдельных параметров запроса
- Если в URL есть пользовательский ввод (формы, поиск, комментарии)
Способ 2: encodeURIComponent() — для параметров и значений
Это ваш главный инструмент на каждый день. encodeURIComponent() кодирует все символы, кроме букв, цифр и -, _, ., ~. Она закодирует даже те символы, которые являются частью синтаксиса URI — &, ?, =, # и так далее.
Синтаксис
encodeURIComponent(str)
Пример
const query = "JavaScript & Node.js: лучшие практики";
const encodedQuery = encodeURIComponent(query);
console.log(encodedQuery);
// Результат: "JavaScript%20%26%20Node.js%3A%20%D0%BB%D1%83%D1%87%D1%88%D0%B8%D0%B5%20%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D0%B8"
// Теперь можно безопасно собрать URL
const baseUrl = "https://pythonlib.ru/search";
const fullUrl = `${baseUrl}?q=${encodedQuery}`;
console.log(fullUrl);
// Результат: "https://pythonlib.ru/search?q=JavaScript%20%26%20Node.js%3A%20%D0%BB%D1%83%D1%87%D1%88%D0%B8%D0%B5%20%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D0%B8"
Видите, как символ & превратился в %26? Это значит, что сервер получит его как часть значения параметра, а не как разделитель.
Практический пример: сборка URL из объекта
Часто на практике нужно собрать URL с несколькими параметрами. Вот элегантный способ:
function buildUrl(baseUrl, params) {
const queryString = Object.entries(params)
.map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`)
.join('&');
return `${baseUrl}?${queryString}`;
}
// Использование
const params = {
q: "JavaScript & Node.js",
page: 1,
lang: "ru"
};
const url = buildUrl("https://api.pythonlib.ru/search", params);
console.log(url);
// Результат: "https://api.pythonlib.ru/search?q=JavaScript%20%26%20Node.js&page=1&lang=ru"
Когда использовать
- Для кодирования значений параметров запроса (query string)
- Для кодирования фрагментов URL (hash)
- Для кодирования данных, отправляемых через
application/x-www-form-urlencoded - Всегда, когда есть пользовательский ввод
Способ 3: Ручное кодирование (старый добрый escape() и кастомные решения)
Раньше в JavaScript была функция escape(), которая тоже кодировала строки. Но она устарела и не рекомендуется к использованию. Почему? Потому что она не поддерживает UTF-8 и работает только с ASCII. Для латиницы разницы нет, но кириллица и другие символы Unicode будут закодированы неправильно.
Блоги
Рекомендаций по книгам
Читайте также
Code review в PHP: что проверять и как давать обратную связь на практике
Обновляем GUI из другого потока в C#: полный гайд с примерами
Кэширование в Swift: Redis, Memcached и встроенные решения для iOS/macOS
Пути в tsconfig.json: что скрывается под капотом TypeScript
Как написать REST API на Rust за 30 минут: пошаговое руководство
Блоги
Рекомендаций по книгам
Читайте также
Как написать REST API на Rust за 30 минут: пошаговое руководство