Как работает URL-кодирование

URL-кодирование заменяет символы, которые нельзя безопасно передать в нужной части адреса, на процентные последовательности. Пробел превращается в %20, а амперсанд внутри одного значения в %26. Декодирование выполняет обратное преобразование.
Главный выбор в форме: кодировать отдельный компонент или адрес целиком. Компонентом может быть значение параметра, имя файла, часть пути или вложенная ссылка. В этом режиме /, ?, &, = и # считаются данными и кодируются. Режим целого адреса сохраняет эти знаки как структурные разделители URL: так различаются стандартные функции encodeURIComponent() и encodeURI().
Инструмент не обрезает строку и не меняет её регистр. Даже один пробел считается данными и даёт %20. Это полезно для точной проверки: скрытый пробел не исчезнет и не подменит исходную строку.
Что означают знаки %D0 и %D1
Процентная запись работает с байтами. Каждый байт записывается как знак % и две шестнадцатеричные цифры от 00 до FF. Пробел в UTF-8 занимает один байт 20, поэтому получается %20. Русская буква обычно занимает два байта, поэтому «ч» превращается в две группы: %D1%87. Это не два разных символа, а одна буква после декодирования.
Латинские буквы, цифры и знаки - _ . ! ~ * ' ( ) в компоненте остаются как есть. Остальные знаки могут стать одной или несколькими группами %XX. Длина результата поэтому растёт неравномерно: кириллица и эмодзи занимают больше места, чем обычные латинские буквы.
В этом калькуляторе пробел всегда кодируется как %20. Знак + для пробела использует другой формат: application/x-www-form-urlencoded, который часто встречается в HTML-формах. Обычное URI-декодирование не заменяет плюс пробелом.
Компонент или адрес целиком: шесть сценариев
Пример 1. Поисковая фраза. Для текста чай & мёд выберите кодирование компонента. Результат: %D1%87%D0%B0%D0%B9%20%26%20%D0%BC%D1%91%D0%B4. Амперсанд стал %26 и больше не делит фразу на два параметра.
Пример 2. Имя файла с папкой. Строка папка/отчёт 2026.pdf в режиме компонента даёт %D0%BF%D0%B0%D0%BF%D0%BA%D0%B0%2F%D0%BE%D1%82%D1%87%D1%91%D1%82%202026.pdf. Слеш стал %2F, поэтому вся строка может быть одним значением. Если слеш должен разделять папки, кодируйте сегменты по отдельности.
Пример 3. Полный URL. Адрес https://example.ru/поиск?q=чай с мёдом&lang=ru#итог в режиме «Адрес целиком» станет https://example.ru/%D0%BF%D0%BE%D0%B8%D1%81%D0%BA?q=%D1%87%D0%B0%D0%B9%20%D1%81%20%D0%BC%D1%91%D0%B4%D0%BE%D0%BC&lang=ru#%D0%B8%D1%82%D0%BE%D0%B3. Протокол, слеши, вопрос, амперсанд и якорь остались на своих местах.
Пример 4. Ссылка внутри ссылки. Вложенный адрес https://example.ru/товар?id=42&цвет=синий кодируется как компонент в https%3A%2F%2Fexample.ru%2F%D1%82%D0%BE%D0%B2%D0%B0%D1%80%3Fid%3D42%26%D1%86%D0%B2%D0%B5%D1%82%3D%D1%81%D0%B8%D0%BD%D0%B8%D0%B9. Теперь внутренние ? и & не изменят структуру внешнего URL.
Пример 5. Закодированный разделитель. Строка a%2Fb%3Fc%3Dd%26e%3Df после декодирования компонента превратится в a/b?c=d&e=f. В режиме целого адреса она останется закодированной, потому что стандартное декодирование URL сохраняет закодированные разделители.
Пример 6. Ошибка в процентном коде. Попытка декодировать %D1%ZZ завершится сообщением об ошибке: ZZ не является парой шестнадцатеричных цифр. Ручная замена похожих знаков здесь опасна: нужно исправить источник строки.
Почему двойное кодирование меняет данные
Знак процента сам кодируется как %25. Поэтому готовая строка чай%20сладкий после повторного кодирования будет содержать %2520. Одно декодирование вернёт %20, и только второе вернёт пробел. Иногда такой слой нужен, например при передаче уже закодированного URL внутри ещё одного параметра. Без такой задачи повторное кодирование создаёт ошибку.
Безопаснее кодировать значения в тот момент, когда вы собираете URL, а не кодировать уже готовый адрес целиком. Если параметр q равен «чай & мёд», сначала превратите именно это значение в %D1%87%D0%B0%D0%B9%20%26%20%D0%BC%D1%91%D0%B4, затем добавьте его после ?q=.
Когда одного URL-кодирования недостаточно
Кодирование не проверяет адрес. Строка может не иметь протокола, содержать неверный домен или параметр без имени, но инструмент всё равно преобразует допустимые символы. Для сборки ссылок в приложении нужен стандартный URL-парсер: он отдельно разберёт протокол, домен, путь, запрос и якорь.
Кириллический домен тоже требует отдельной обработки. Например, пример.рф в сетевой записи превращается в xn--e1afmkfd.xn--p1ai по правилам IDNA. Обычное процентное кодирование не заменяет этот шаг. Браузеры обычно делают преобразование домена сами.
Если в параметр передаётся сложный объект, сначала проверьте его в форматтере JSON, а затем кодируйте готовую строку как один компонент. Base64 представляет байты печатными ASCII-символами, а декодер текста исправляет кракозябры от неверной кодировки. Это разные задачи, хотя внешне результат каждой может выглядеть как непонятная строка.
Готовую ссылку можно передать не только текстом. Генератор QR-кода превратит её в матрицу для камеры. Перед этим откройте ссылку в новой вкладке: правильная процентная запись не спасёт опечатку в домене или пути.
Частые вопросы
Эти ответы помогут разобрать плюсы, слеши, якори, повторное декодирование и домены без подмены одной схемы другой.
Чем URL отличается от URI?
URI идентифицирует ресурс, а URL дополнительно указывает, где он находится или как к нему обратиться. В бытовой веб-разработке чаще говорят URL, хотя встроенные функции JavaScript исторически используют слово URI в названиях.
Почему пробел иногда записан как +, а иногда как %20?
%20 является обычной процентной записью байта пробела. Плюс вместо пробела задаёт формат HTML-форм application/x-www-form-urlencoded. Для такой строки перед URI-декодированием нужно отдельно заменить плюсы пробелами.
Почему слеш не кодируется?
Выбран режим «Адрес целиком», где слеш разделяет сегменты пути. Если слеш является частью одного значения, выберите «Компонент URL»: тогда / превратится в %2F.
Можно ли декодировать строку дважды?
Можно, если вы точно знаете, что строка была закодирована два раза. В других случаях второй проход может превратить закодированный %2F в слеш и изменить структуру пути. Сравнивайте результат после каждого слоя.
Нужно ли кодировать знак #?
В готовом URL знак # начинает фрагмент, который браузер обычно не отправляет серверу. Если решётка должна остаться буквальным знаком в значении параметра, кодируйте это значение как компонент. Решётка станет %23.
Как кодировать кириллический домен?
Для имени домена нужно IDNA-преобразование, а не обычное процентное кодирование. Например, пример.рф записывается как xn--e1afmkfd.xn--p1ai. Путь и параметры после домена обрабатываются отдельно.
Проверяет ли кодировщик, что URL существует?
Нет. Он преобразует символы, но не открывает сайт, не проверяет DNS и не исправляет синтаксис. Перед публикацией откройте готовую ссылку и проверьте целевую страницу.
Почему декодирование показывает ошибку UTF-8?
Последовательности %XX должны собираться в допустимые байты UTF-8. Например, одинокий %D1 начинает двухбайтовый символ, но не содержит второго байта. Такую строку нельзя однозначно превратить в текст, поэтому калькулятор останавливается.
Похожие калькуляторы
Возможно вам пригодятся ещё несколько калькуляторов по данной теме:
- Форматтер и валидатор JSON. Проверьте JSON, приведите его к читаемому виду или сожмите без потери данных.
- Конвертер Base64. Кодируйте текстовую строку в Base64 и декодируйте её обратно в UTF-8.
- Генератор QR-кода. Вставьте ссылку или текст. Готовый QR-код можно скопировать или скачать как PNG.
- Декодер текста. Исправьте кракозябры и восстановите читаемый текст, не стирая оригинал.
- Визуальный редактор HTML. Редактируйте бесплатно и онлайн HTML-код, и сразу же смотрите внешний вид текста и страницы в режиме предпросмотра (WYSIWYG).
- Генератор паролей. Создайте сложный и надёжный пароль бесплатно с помощью онлайн-генератора из 8, 10, 12 или большего числа рандомных (случайных) символов.
- Сумма прописью. Переведите сумму в виде цифр в сумму прописью - текстом. Сделайте расшифровку правильно для договоров и других документов.
- Хрономер: время чтения текста. Оцените, сколько времени займёт чтение или произнесение текста вслух. Просто введите текст в форму, и хронометраж рассчитается автоматически.
- Рандомайзер: генератор случайных чисел. Выберите случайное число в нужном диапазоне для любых целей, в частности для розыгрышей и онлайн-лотерей в соцсетях.
- Случайный выбор из списка. Добавьте варианты по одному в строке, укажите количество и выберите режим повторов.
Есть что добавить?
Напишите своё мнение, комментарий или предложение.