UltKit
Изображения11
PDF13
Документы и данные7
Видео6
Аудио4
Другие инструменты22

URL-кодирование и декодирование

Сделайте текст безопасным для вставки в URL или верните последовательности вида %20 в читаемые символы. Инструмент использует встроенные в ваш браузер функции encodeURIComponent, encodeURI и decodeURIComponent, показывает параметры запроса в таблице и ничего не отправляет на сервер.

Режим

Символов: 0 · слов: 0 · строк: 0

Символов: 0 · слов: 0 · строк: 0

Всё работает в этой вкладке браузера. Ваш текст никуда не загружается и не сохраняется.

Что экранирует каждая функция

Вычислено самими функциями браузера. encodeURIComponent не трогает буквы, цифры и следующие знаки: ! ' ( ) * - . _ ~

СимволencodeURIComponentencodeURI
(пробел)%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.