UltKit

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 是 2005 年发布的 URI 语法规范,它把这些字符分成两类。非保留字符包括 A–Z、a–z、0–9 以及 - . _ ~ 这四个符号,永远不需要编码。保留字符各有用途:通用分隔符 : / ? # [ ] @ 用来分隔协议、主机、路径、查询和片段,子分隔符 ! $ & ' ( ) * + , ; = 用来分隔它们内部的各个部分,比如查询字符串中的 & 和 =。其余所有字符,以及被当作普通数据使用的保留字符,都必须进行百分号编码。

百分号编码把一个字节写成 % 加两位十六进制数字。文本会先转换为 UTF-8,因此空格变成 %20,é(两个字节)变成 %C3%A9,一个 emoji 则变成四组 %XX。所以搜索“café & bar”时,链接中会显示为 caf%C3%A9%20%26%20bar:其中的 & 被编码后,服务器就不会把它当作新参数的开头。

encodeURIComponent、encodeURI与解码

encodeURIComponent 适合处理单独的一段内容,例如查询参数的值、路径片段,或作为参数传递的跳转 URL。它会转义除非保留字符和 ! ' ( ) * 之外的所有字符(JavaScript 因历史原因不处理这几个字符)。encodeURI(整个 URL) 默认输入已经是完整地址,会保留保留字符不变,所以 https://example.com/a b?q=1 只有空格会被编码。对参数值使用 encodeURI 是常见的错误:值里的 & 或 # 不会被编码,会破坏整个 URL。

解码可以还原上述任一函数的结果。用 GET 提交的 HTML 表单采用较早的 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。