URL-encode и URL-decode онлайн: переводит специальные символы в percent-encoded формат %XX и обратно, раскодирует ссылку целиком. Четыре режима: encodeURIComponent, encodeURI, строго по RFC 3986 для подписей OAuth и AWS и как форма (URLSearchParams).
Примерыадрес целиком кодирует encodeURI, остальные функции — для значения параметра
Результат · encodeURIComponent
Результат появится здесь…
Вход: 0 симв. · Выход: 0 симв.
02
Что кодирует каждая функция
encodeURIComponent агрессивнее — кодирует всё, кроме безопасных. encodeURI сохраняет структуру URL.
Символ
encodeURIComponent
encodeURI
A–Z a–z 0–9
Не кодируется
Не кодируется
- _ . ! ~ * ' ( )
Не кодируется
Не кодируется
: / ? # @ &
%3A %2F %3F %23 %40 %26
Не кодируется
= + , ;
%3D %2B %2C %3B
Не кодируется
Пробел
%20
%20
А–Я а–я (кириллица)
%D0%9F… (UTF-8)
%D0%9F… (UTF-8)
Китайский, арабский, эмодзи
%XX%XX… (UTF-8)
%XX%XX… (UTF-8)
Строго по RFC 3986 и как форма
Для значения параметра есть три правила записи: encodeURIComponent, строгий RFC 3986 для подписей OAuth и AWS и кодирование HTML-формы (URLSearchParams). Коды в таблице вычислены теми же функциями, что работают в кодировщике выше.
Символ
encodeURIComponent
RFC 3986
Форма
пробел
%20
%20
+
!
!
%21
%21
'
'
%27
%27
(
(
%28
%28
)
)
%29
%29
*
*
%2A
*
~
~
~
%7E
-
-
-
-
_
_
_
_
.
.
.
.
+
%2B
%2B
%2B
/
%2F
%2F
%2F
&
%26
%26
%26
=
%3D
%3D
%3D
?
%3F
%3F
%3F
#
%23
%23
%23
Строки, где режимы расходятся, — это ровно пять символов ! ' ( ) * плюс пробел и тильда. Остальное одинаково.
Все печатные символы ASCII
Коды не выписаны, а вычислены теми же функциями, которыми работает кодировщик выше. Красным помечены 11 символов, у которых функции расходятся: encodeURI оставляет их как есть, потому что они держат синтаксис адреса.
Символ
Код
encodeURIComponent
encodeURI
RFC 3986
Форма
Роль по RFC 3986
␠
%20
%20
%20
%20
+
небезопасный
!
%21
!
!
%21
%21
подразделитель
"
%22
%22
%22
%22
%22
небезопасный
#
%23
%23
#
%23
%23
разделитель адреса
$
%24
%24
$
%24
%24
подразделитель
%
%25
%25
%25
%25
%25
небезопасный
&
%26
%26
&
%26
%26
подразделитель
'
%27
'
'
%27
%27
подразделитель
(
%28
(
(
%28
%28
подразделитель
)
%29
)
)
%29
%29
подразделитель
*
%2A
*
*
%2A
*
подразделитель
+
%2B
%2B
+
%2B
%2B
подразделитель
,
%2C
%2C
,
%2C
%2C
подразделитель
-
%2D
-
-
-
-
безопасный
.
%2E
.
.
.
.
безопасный
/
%2F
%2F
/
%2F
%2F
разделитель адреса
0
%30
0
0
0
0
безопасный
1
%31
1
1
1
1
безопасный
2
%32
2
2
2
2
безопасный
3
%33
3
3
3
3
безопасный
4
%34
4
4
4
4
безопасный
5
%35
5
5
5
5
безопасный
6
%36
6
6
6
6
безопасный
7
%37
7
7
7
7
безопасный
8
%38
8
8
8
8
безопасный
9
%39
9
9
9
9
безопасный
:
%3A
%3A
:
%3A
%3A
разделитель адреса
;
%3B
%3B
;
%3B
%3B
подразделитель
<
%3C
%3C
%3C
%3C
%3C
небезопасный
=
%3D
%3D
=
%3D
%3D
подразделитель
>
%3E
%3E
%3E
%3E
%3E
небезопасный
?
%3F
%3F
?
%3F
%3F
разделитель адреса
@
%40
%40
@
%40
%40
разделитель адреса
A
%41
A
A
A
A
безопасный
B
%42
B
B
B
B
безопасный
C
%43
C
C
C
C
безопасный
D
%44
D
D
D
D
безопасный
E
%45
E
E
E
E
безопасный
F
%46
F
F
F
F
безопасный
G
%47
G
G
G
G
безопасный
H
%48
H
H
H
H
безопасный
I
%49
I
I
I
I
безопасный
J
%4A
J
J
J
J
безопасный
K
%4B
K
K
K
K
безопасный
L
%4C
L
L
L
L
безопасный
M
%4D
M
M
M
M
безопасный
N
%4E
N
N
N
N
безопасный
O
%4F
O
O
O
O
безопасный
P
%50
P
P
P
P
безопасный
Q
%51
Q
Q
Q
Q
безопасный
R
%52
R
R
R
R
безопасный
S
%53
S
S
S
S
безопасный
T
%54
T
T
T
T
безопасный
U
%55
U
U
U
U
безопасный
V
%56
V
V
V
V
безопасный
W
%57
W
W
W
W
безопасный
X
%58
X
X
X
X
безопасный
Y
%59
Y
Y
Y
Y
безопасный
Z
%5A
Z
Z
Z
Z
безопасный
[
%5B
%5B
%5B
%5B
%5B
разделитель адреса
\
%5C
%5C
%5C
%5C
%5C
небезопасный
]
%5D
%5D
%5D
%5D
%5D
разделитель адреса
^
%5E
%5E
%5E
%5E
%5E
небезопасный
_
%5F
_
_
_
_
безопасный
`
%60
%60
%60
%60
%60
небезопасный
a
%61
a
a
a
a
безопасный
b
%62
b
b
b
b
безопасный
c
%63
c
c
c
c
безопасный
d
%64
d
d
d
d
безопасный
e
%65
e
e
e
e
безопасный
f
%66
f
f
f
f
безопасный
g
%67
g
g
g
g
безопасный
h
%68
h
h
h
h
безопасный
i
%69
i
i
i
i
безопасный
j
%6A
j
j
j
j
безопасный
k
%6B
k
k
k
k
безопасный
l
%6C
l
l
l
l
безопасный
m
%6D
m
m
m
m
безопасный
n
%6E
n
n
n
n
безопасный
o
%6F
o
o
o
o
безопасный
p
%70
p
p
p
p
безопасный
q
%71
q
q
q
q
безопасный
r
%72
r
r
r
r
безопасный
s
%73
s
s
s
s
безопасный
t
%74
t
t
t
t
безопасный
u
%75
u
u
u
u
безопасный
v
%76
v
v
v
v
безопасный
w
%77
w
w
w
w
безопасный
x
%78
x
x
x
x
безопасный
y
%79
y
y
y
y
безопасный
z
%7A
z
z
z
z
безопасный
{
%7B
%7B
%7B
%7B
%7B
небезопасный
|
%7C
%7C
%7C
%7C
%7C
небезопасный
}
%7D
%7D
%7D
%7D
%7D
небезопасный
~
%7E
~
~
~
%7E
безопасный
Отдельный случай — ! ' ( ) *: по RFC 3986 это подразделители, но encodeURIComponent родом из ECMAScript 3 и оставляет их нетронутыми. В пути и в имени файла они доезжают до сервера как есть.
Буквы вне латиницы
Процентная запись кодирует байты, а не символы: сколько байтов занимает буква в UTF-8, столько пар и получится.
п
%D0%BF
2 байта
ы
%D1%8B
2 байта
中
%E4%B8%AD
3 байта
😀
%F0%9F%98%80
4 байта
03
О URL-кодировании — что стоит знать
URL-кодирование (percent-encoding) представляет любые символы в URL с помощью ASCII-последовательностей вида %XX, где XX — шестнадцатеричный код байта в UTF-8. Нужно потому, что URL может содержать только ограниченный набор безопасных символов.
Выбор функции зависит от задачи: encodeURIComponent — для значения одного параметра запроса. encodeURI — для полного URL, когда нужно сохранить его синтаксис (двоеточия, слэши, вопросительные знаки).
Почему ! ' ( ) * кодируют не все. В RFC 3986 эти пять символов относятся к sub-delims — то есть в адресе они разрешены, и encodeURIComponent их не трогает. Но подписи OAuth 1.0a и AWS SigV4 требуют «процент-кодировать всё, кроме A–Z a–z 0–9 - _ . ~»: если хотя бы один из этих символов остался как есть, подпись не сойдётся и сервер вернёт ошибку. Поэтому для подписей и для сравнения адресов нужен строгий режим. Тильда ~ — наоборот: в RFC 3986 она unreserved и кодироваться не должна, хотя старые библиотеки по привычке превращают её в %7E. В формах (application/x-www-form-urlencoded) набор ещё другой: пробел становится +, тильда кодируется, а звёздочка остаётся.
Кодирует всё, кроме букв, цифр и `- _ . ! ~ * ' ( )`. Символы `: / ? # @ & =` тоже кодируются — значение параметра не «сломает» структуру URL. Использовать для значений параметров ?q=… и данных форм.
Сохраняет структуру URL: не кодирует `: / ? # [ ] @ ! $ & ' ( ) * + , ; =`. Использовать когда нужно передать полный адрес как строку, не разрушая его синтаксис.
Декодирование
%D0%BF%D1%80%D0%B8%D0%B2%D0%B5%D1%82 → «привет»
Обратная операция — переводит %XX-последовательности обратно в читаемый текст. Поддерживается формат `+` вместо пробела из HTML-форм (application/x-www-form-urlencoded).
Percent-encoding
RFC 3986
%XX — где XX — hex-код байта в UTF-8
Каждый небезопасный символ представляется как `%XX`, где XX — hex-код байта в UTF-8. Кириллица занимает 2 байта (6 символов %XX%XX на букву), эмодзи — 4 байта.
04
Частые вопросы
Вставьте адрес в поле — кириллица и спецсимволы заменятся процентными последовательностями. Одна кириллическая буква в UTF-8 занимает два байта и превращается в шесть знаков вида `%D0%BF`. Такой адрес одинаково понимают все системы, включая почтовые клиенты и мессенджеры, которые ломают ссылку с юникодом при пересылке.
Символы `! ' ( ) *` в RFC 3986 разрешены в адресе, поэтому стандартная функция их пропускает. Но подписи OAuth 1.0a и AWS SigV4 требуют закодировать всё, кроме букв, цифр и `- _ . ~`: если хотя бы один из пяти символов остался как есть, подпись не сойдётся и сервер вернёт ошибку. Для этого на странице есть режим «Строго по RFC 3986» — он кодирует и их, а тильду оставляет.
Набором символов, которые остаются нетронутыми. `encodeURI` не трогает `: / ? # & =`, потому что предназначен для адреса целиком. `encodeURIComponent` кодирует и их — он для отдельного значения параметра, внутри которого могут оказаться слэши или амперсанды. Выбор не той функции ломает разбор параметров на стороне сервера.
Плюсом пробел кодируется в HTML-форме, отправленной как `application/x-www-form-urlencoded`, и по традиции в строке запроса; в остальных частях адреса это `%20`. Наборы у формы и адреса разные и в другом: форма кодирует тильду в `%7E`, а звёздочку оставляет. Чтобы сверить, что реально ушло в запросе, выберите режим «Как форма». При декодировании страница сама определяет, пробел это или плюс, и объясняет почему.
Вставьте закодированный адрес и переключитесь на декодирование — процентные последовательности превратятся в исходные символы, а про каждый `+` страница сама определит, пробел это или настоящий плюс. Если строку кодировали дважды, операцию придётся повторить: признак двойного кодирования — последовательности вида `%25D0`, где `%25` и есть сам знак процента.
Нет. Кодирование и декодирование выполняет ваш браузер, адрес не покидает устройство. Это существенно: в ссылках регулярно оказываются токены авторизации, ключи API и идентификаторы сессий, а вставленная в сторонний сервис ссылка равна выданному доступу. На сервер уходит только название открытого инструмента.