Кодировщик/Декодировщик URL
Быстрое URL кодирование и декодирование с поддержкой различных режимов кодирования
Выберите способ преобразования
Что такое URL кодирование?
URL-кодирование (также называемое процентным кодированием) — это механизм преобразования символов в формат, который может быть безопасно передан в URL. Поскольку URL могут содержать только определённые символы набора ASCII, другие символы (такие как кириллица, пробелы и специальные символы) должны быть закодированы в формате %XX, где XX — шестнадцатеричное значение символа. Например: пробел кодируется как %20, а буква «Д» кодируется как %D0%94. URL-encoding преобразует символы в форму, безопасную для передачи внутри URL. Пробелы, non-ASCII текст, reserved characters и специальные символы percent-encode в зависимости от контекста. Важно различать полный URL, path segment, query parameter, form body и fragment, потому что правила escaping разные. Двойное кодирование или его отсутствие может сломать ссылки, API requests, signatures, redirects и поисковые параметры.
Как пользоваться
Как пользоваться
- Введите или вставьте текст для кодирования/декодирования в поле ввода
- Выберите метод кодирования: encodeURIComponent или encodeURI
- Результаты появляются автоматически; доступно копирование или обмен ввода/вывода одним нажатием
- Для декодирования выберите соответствующий метод
Контекст URL
- Используйте кодирование компонентов для значений параметров запроса и сегментов пути: кодирование всего URL неправильной функцией может сломать разделители вроде /, ? и &.
- При декодировании проверяйте двойное кодирование, например %2520 — это означает, что символ процента был закодирован повторно.
Применение
Технический принцип
URL-кодирование (процентное кодирование) определено в RFC 3986 §2.1 и преобразует символы в формат %XX, где XX — двузначное верхнее шестнадцатеричное представление значения байта в UTF-8. RFC определяет два класса символов: незарезервированные (A-Z a-z 0-9 - _ . ~), которые никогда не кодируются, и зарезервированные (общие разделители : / ? # [ ] @ и вспомогательные разделители ! $ & ' ( ) * + , ; =), кодирование которых зависит от контекста — они несут структурный смысл в некоторых компонентах URL, но являются буквальными данными в других. JavaScript предоставляет две встроенные функции с разным охватом. encodeURIComponent() кодирует каждый символ, кроме A-Z a-z 0-9 - _ . ! ~ * ' ( ) — это правильный выбор для кодирования отдельных значений параметров запроса, сегментов пути и идентификаторов фрагмента. encodeURI() дополнительно сохраняет структурные символы : / ? # [ ] @ ! $ & ' ( ) * + , ; = и предназначена для кодирования целых URI с сохранением их синтаксической структуры. Ключевое различие в том, что encodeURIComponent() кодирует / и &, что сломает URL при применении к целой строке, тогда как encodeURI() сохраняет их. Обработка пробелов — самая частая ловушка совместимости. RFC 3986 указывает %20 как каноническое процентное кодирование символа пробела (U+0020). Однако MIME-тип application/x-www-form-urlencoded (используемый при отправке HTML-форм с HTML 4.01) кодирует пробелы как +. Они не взаимозаменяемы: сервер, ожидающий %20, интерпретирует + буквально, а сервер, ожидающий +, трактует %20 как буквальный знак процента, за которым следует 20. Инструмент использует encodeURIComponent(), который выдаёт %20, что соответствует RFC 3986. При декодировании нагрузок x-www-form-urlencoded (из тел POST или строк запроса, разобранных устаревшими промежуточными слоями) следует учитывать эту разницу. Обработка многобайтовых символов выполняется автоматически, но требует понимания: входная строка сначала кодируется в байты UTF-8, затем каждый байт индивидуально кодируется процентным кодированием. CJK-символ, например «你» (U+4F60), занимает 3 байта UTF-8 (E4 BD A0), что даёт %E4%BD%A0. Если сервер разбирает с другой кодировкой, например GBK, тот же символ кодируется как %C4%E3 (2 байта), и декодированный результат будет искажён, если обе стороны не договорились о UTF-8. Двойное кодирование — другая распространённая ошибка: %2520 означает буквальный знак процента (%25), за которым следует 20, что указывает на повторное процентное кодирование уже закодированного ввода. Режим декодирования обнаруживает некорректные последовательности (неполные %XX) и выводит ошибку, а не генерирует мусор молча.
- encodeURIComponent и encodeURI: encodeURIComponent кодирует / ? & # и подходит для значений запросов, сегментов пути и фрагментов; encodeURI сохраняет эти структурные символы и подходит для полных URL — использование неправильной функции является самой распространённой ошибкой URL-кодирования.
- Наборы зарезервированных символов RFC 3986: общие разделители (: / ? # [ ] @) несут синтаксис URL; вспомогательные разделители (! $ & ' ( ) * + , ; =) могут быть разделителями или данными в зависимости от компонента URL — контекст определяет, будет ли зарезервированный символ процентно закодирован.
- Кодирование пробелов: каноническая форма RFC 3986 — %20 (генерируется encodeURIComponent); application/x-www-form-urlencoded использует + (по умолчанию в HTML-формах) — семантически они несовместимы, и их смешение ломает серверные парсеры.
- Многобайтовое кодирование UTF-8: «你» (U+4F60) → байты UTF-8 E4 BD A0 → %E4%BD%A0 (3 процентно-кодированных октета); тот же символ в GBK → %C4%E3 (2 октета) — согласование кодировки между клиентом и сервером обязательно для не-ASCII текста.
- Обнаружение двойного кодирования: %2520 декодируется сначала в %20, затем в пробел — вывод режима декодирования выявляет этот паттерн; некорректные последовательности, такие как %ZZ или %2 (неполные), перехватываются и сообщаются как ошибки.
- IRI (RFC 3987): интернационализированные идентификаторы ресурсов допускают символы Unicode непосредственно в URL; браузеры отображают декодированную форму в адресной строке, но передают процентно-закодированную форму UTF-8 по сети — режим кодирования инструмента показывает то, что фактически передаётся по HTTP.
- Обработка ошибок decodeURIComponent: передача строки с неполной процентной последовательностью (% и менее 2 шестнадцатеричных цифр) вызывает URIError — инструмент оборачивает вызов в try/catch и выводит сообщение об ошибке, а не молча возвращает пустую строку.
Примеры
Кодирование китайских символов (UTF-8 percent-encoding)
Вход: 你好世界 (4 символа CJK, 12 байт UTF-8)
Выход: %E4%BD%A0%E5%A5%BD%E4%B8%96%E7%95%8C
Каждый байт UTF-8 (E4, BD, A0, ...) превращается в %XX
RFC: раздел 2.1 RFC 3986 определяет percent-encoding для URI
Применение: параметры запроса, сегменты пути, отправка формКодирование разделителей query string
Вход: name=张三&age=20
Выход: name%3D%E5%BC%A0%E4%B8%89%26age%3D20
%3D кодирует '=' (разделитель между ключом и значением)
%26 кодирует '&' (разделитель между параметрами)
RFC: раздел 3.4 RFC 3986 определяет зарезервированные символы компонента запросаКодирование полного URL (частичное кодирование)
Вход: https://example.com/search?q=你好&type=web
Выход: https://example.com/search?q=%E4%BD%A0%E5%A5%BD&type=web
Примечание: схема, хост и существующие разделители НЕ кодируются
Кодируется только не-ASCII значение в query
RFC: раздел 3 RFC 3986 определяет иерархические компоненты URIКодирование пробелов (две конвенции)
Сегмент пути: %20 (соответствует RFC 3986)
Query string: + (историческая конвенция HTML-форм)
Пример: /search for me -> /search%20for%20me
Пример: q=hello world -> q=hello+world
Оба варианта декодируются в один и тот же результат; encodeURI использует %20, encodeURIComponent в некоторых реализациях использует %20 для пути и + для queryЧасто задаваемые вопросы
Что делает URL-кодирование?
Заменяет небезопасные символы в URL последовательностями с %: пробел → %20, & → %26, # → %23 и т. д. RFC 3986 перечисляет, какие символы безопасны (буквы и цифры плюс -, _, ., ~), а какие требуют кодирования. Браузеры, серверы и HTTP-библиотеки применяют или ожидают URL-кодирование на нужных границах.
В чём разница между encodeURI и encodeURIComponent?
encodeURI оставляет символы синтаксиса URL (: / ? # & =) нетронутыми — она ожидает целый URL. encodeURIComponent кодирует и их — она ожидает значение одного параметра. Страница даёт оба режима: для параметров запроса берите component-кодирование, для URL целиком — URI-кодирование.
Почему пробел иногда становится %20, а иногда +?
%20 — это стандарт URI. + — устаревшее соглашение для MIME-типа application/x-www-form-urlencoded, используемого при отправке HTML-форм. Большинству серверов они выглядят одинаково, но строго эквивалентными не являются — в современных URL используйте %20.
Нужно ли кодировать символы Unicode?
RFC 3986 разрешает только ASCII; не-ASCII должен быть закодирован в UTF-8 и затем процентно-экранирован (中 → %E4%B8%AD). Современные браузеры показывают Unicode в адресной строке, но передают по сети закодированный вид. Страница автоматически выполняет шаг UTF-8-кодирования.
Какие символы никогда не нужно кодировать?
Незарезервированные символы по RFC 3986: A–Z, a–z, 0–9, -, _, ., ~. Их кодирование технически разрешено, но даёт другую строку URL; серверы могут считать «a» и «%61» эквивалентными или разными — зависит от правил канонизации.
Почему в декодированном URL странные символы?
Скорее всего, он был закодирован дважды: %2520 декодируется в %20, потом в пробел — значит, кто-то закодировал URL дважды. В таком случае декодируйте дважды. Некоторые серверы автоматически удваивают кодирование; проверьте поведение клиента.
Кодирование выполняется локально?
Да. encodeURIComponent и decodeURIComponent работают в вашем браузере. URL никуда не отправляются.