URL-кодирование и декодирование
Сделайте текст безопасным для вставки в URL или верните последовательности вида %20 в читаемые символы. Инструмент использует встроенные в ваш браузер функции encodeURIComponent, encodeURI и decodeURIComponent, показывает параметры запроса в таблице и ничего не отправляет на сервер.
Символов: 0 · слов: 0 · строк: 0
Символов: 0 · слов: 0 · строк: 0
Всё работает в этой вкладке браузера. Ваш текст никуда не загружается и не сохраняется.
Что экранирует каждая функция
Вычислено самими функциями браузера. encodeURIComponent не трогает буквы, цифры и следующие знаки: ! ' ( ) * - . _ ~
| Символ | encodeURIComponent | encodeURI |
|---|---|---|
(пробел) | %20 | %20 |
! | ! | ! |
" | %22 | %22 |
# | %23 | # |
$ | %24 | $ |
% | %25 | %25 |
& | %26 | & |
' | ' | ' |
( | ( | ( |
) | ) | ) |
* | * | * |
+ | %2B | + |
, | %2C | , |
/ | %2F | / |
: | %3A | : |
; | %3B | ; |
= | %3D | = |
? | %3F | ? |
@ | %40 | @ |
[ | %5B | %5B |
] | %5D | %5D |
{ | %7B | %7B |
} | %7D | %7D |
| | %7C | %7C |
\ | %5C | %5C |
^ | %5E | %5E |
` | %60 | %60 |
< | %3C | %3C |
> | %3E | %3E |
~ | ~ | ~ |
- | - | - |
_ | _ | _ |
. | . | . |
é | %C3%A9 | %C3%A9 |
€ | %E2%82%AC | %E2%82%AC |
😀 | %F0%9F%98%80 | %F0%9F%98%80 |
Процентное кодирование и зарезервированные символы RFC 3986
URL может содержать лишь ограниченный набор ASCII-символов. RFC 3986, спецификация синтаксиса URI 2005 года, делит их на две группы. Незарезервированные символы — A–Z, a–z, 0–9 и четыре знака - . _ ~ — кодировать не нужно никогда. У зарезервированных символов есть своя роль: общие разделители : / ? # [ ] @ отделяют схему, хост, путь, запрос и фрагмент, а подразделители ! $ & ' ( ) * + , ; = разделяют элементы внутри них, как & и = в строке запроса. Всё остальное, а также любой зарезервированный символ, используемый как обычные данные, нужно кодировать с помощью процентного кодирования.
Процентное кодирование записывает байт как % и две шестнадцатеричные цифры. Сначала текст преобразуется в UTF-8, поэтому пробел превращается в %20, буква é (два байта) — в %C3%A9, а эмодзи — в четыре группы %XX. Поэтому поисковый запрос «café & bar» попадает в ссылку как caf%C3%A9%20%26%20bar: символ & кодируется, чтобы сервер не принял его за начало нового параметра.
encodeURIComponent, encodeURI и декодирование
encodeURIComponent подходит для отдельной части: значения параметра запроса, сегмента пути или адреса перенаправления, переданного как параметр. Функция экранирует всё, кроме незарезервированных символов и ! ' ( ) *, которые JavaScript по историческим причинам не трогает. encodeURI (весь URL) исходит из того, что на входе уже полный адрес, и сохраняет зарезервированные символы, поэтому в https://example.com/a b?q=1 кодируется только пробел. Применять encodeURI к значению параметра — классическая ошибка: & или # внутри значения останутся как есть и сломают URL.
Декодировать отменяет любую из этих функций. HTML-формы, отправленные методом GET, используют более старый формат application/x-www-form-urlencoded, где пробел записывается как +, а не %20; для таких данных оставьте галочку Считать + пробелом, а если важен именно знак плюса, например в номере телефона, снимите её. Если во входных данных есть % без двух шестнадцатеричных цифр после него или байты, не являющиеся корректным UTF-8, декодирование завершится понятным сообщением об ошибке, а не будет гадать. Если в тексте есть строка запроса, её параметры в декодированном виде появятся в таблице под инструментом. Для двоичных данных в URL обычно используют Base64url.
Часто задаваемые вопросы
- Как кодировать пробел в URL: %20 или знаком плюс?
- В путях и по RFC 3986 пробел кодируется как %20. Форма + означает пробел только в строках запроса, закодированных так, как это делают HTML-формы, поэтому %20 — надёжный вариант везде.
- Почему в моем URL появилось %2520?
- Он был закодирован дважды. При первом проходе пробел превратился в %20, а при втором сам символ % закодировался как %25. Декодируйте один раз, чтобы убрать лишний слой, а значения кодируйте только в одном месте кода.
- Какие символы никогда не нужно кодировать?
- Незарезервированные символы по RFC 3986: латинские буквы A–Z в обоих регистрах, цифры 0–9, а также дефис, точка, подчёркивание и тильда.
- Может ли URL содержать кириллицу и другие нелатинские буквы без кодирования?
- Браузеры их отображают, но при передаче каждый символ не из ASCII в пути или запросе отправляется как процентно-кодированный UTF-8. Доменные имена используют отдельную систему, Punycode, которая превращает их в метки вида xn--.
- Почему при декодировании появляется ошибка о некорректной последовательности?
- В тексте есть % без двух шестнадцатеричных цифр после него, например буквальное «100%», либо байты декодируются в некорректный UTF-8. Перед декодированием закодируйте одиночные знаки % как %25.