跳到正文

← 全部工具

免费在线工具

URL 编码、解码与网址拆解

对文本做百分号编码或解码,并看清楚哪些字符被改动。三种编码方式都用大白话解释;遇到有问题的 % 编码,会告诉你错在哪,而不是直接失败;把网址贴进拆解区,就能看到主机、路径、参数和片段。不会上传任何内容,全部在本页里运行。

编码或解码文本

输入或粘贴文本,选好要编码的内容,结果会随输入实时更新。中文、表情等字符会按 UTF-8 转成百分号编码(如 %E4%BD%A0)。

方向
你要编码的是什么?

共 25 个字符,其中 14 个被改动(已高亮)。

结果

name%3DZo%C3%AB%20%26%20%E4%BD%A0%E5%A5%BD%20%F0%9F%98%80%20%2F%2050%25%20off

abc = 被改动

拆解一个网址

粘贴网址,就能看到协议、用户、主机、端口、路径、查询参数和片段。在下面修改参数,网址会随之重新组装。

只有上面的网址是相对地址(如 /path?x=1 或 ../page)时才需要。完整网址请留空。

各个部分

协议
https
用户名
user
密码
p%40ss
主机
xn--mnchen-3ya.de
主机(Unicode)
münchen.de
端口
8443
来源(Origin)
https://xn--mnchen-3ya.de:8443
路径
/a%20b/%E6%96%87%E6%A1%A3
片段
top

含非英文字符的域名会以 ASCII 形式(punycode,以 xn-- 开头)保存,这里两种写法都显示。

路径分段

#原文解码后
1a%20ba b
2%E6%96%87%E6%A1%A3文档

查询参数

按出现顺序显示解码后的内容,重复的参数名都会保留。没有 = 的参数显示为空值。

开启:空格写成 +。关闭:空格写成 %20。在查询串里两者都读作空格,但在路径里 + 不是空格。

URL

https://user:p%40ss@xn--mnchen-3ya.de:8443/a%20b/%E6%96%87%E6%A1%A3?q=hello+world&tag=a&tag=b&empty=#top

还没有改动。修改任意参数,这里会重新组装网址。

它是怎么工作的

  • •百分号编码是把字符按 UTF-8 写成字节,每个字节写成 % 加两位十六进制数。汉字“你”会变成 %E4%BD%A0,一个表情会变成四个编码。查询参数的值或一段路径选“单个值”,必须保持可用的完整地址选“整个网址”,网页表单提交的内容选“表单数据”。
  • •三种方式和 JavaScript、浏览器的做法一致:单个值对应 encodeURIComponent,整个网址对应 encodeURI,表单数据对应 URLSearchParams 的格式。差别很小但确实存在:表单数据把空格写成 +,同时会编码 ~ ! ' ( )。Python 的 quote_plus 正好相反,保留 ~,编码 *,与网页标准不同。
  • •解码默认是严格的。如果 % 后面不是两位十六进制数,或者字节不是合法的 UTF-8(比如被截断的 %E4%BD,或者用 GBK 编码的文本),本页会标出具体位置,而不是显示一堆乱码。勾选“能解的尽量解”,就会得到和 Python 类似、带替换字符的结果。
  • •+ 只有在表单数据和查询串里才表示空格,在路径里不是,所以解码也分出了表单模式。像 %2520 这样的文本会被提示“可能编码了两次”,因为 %25 就是 % 本身的编码;再解一次才能得到真正的文本。
  • •拆解区使用和浏览器相同的网址解析器(WHATWG URL 标准),它和 Python 的 urlsplit 并不一样:会去掉默认端口(:443),处理 /a/../b,把路径里的空格和非英文字母写成 %20 之类的编码,把反斜杠当作斜杠,把 0x7f.1 这样的数字主机改写成 127.0.0.1,并把国际化域名转成 punycode。xn-- 形式和可读形式都会显示。查询参数只按 & 拆分,不按 ; 拆分。
  • •限制:文本最多 200,000 个字符,网址最多 20,000 个字符。网址必须带 https:// 这样的协议才能单独解析;相对地址请填写基础网址。修改后的参数会按表单方式重新编码,原来的 %20 可能变成 +,服务器在查询串里读到的含义相同。

常见问题

会上传我的文本吗?
不会。编码、解码和网址解析都在本页里运行,不会发送到任何地方。复制也是在你的设备上完成。
空格该写成 %20 还是 +?
路径里一律用 %20。查询串里,几乎所有服务器都把两者读作空格,但 %20 更稳妥,因为 + 只在表单格式的数据里才是空格。想确定某个服务器的要求,请查看它的文档。
为什么我的文本里出现了 %2520?
有东西把已经编码过的字符串又编码了一次:%20 里的 % 变成了 %25。解码一次得到 %20,再解一次得到空格,也可以点“再解码一次”。更重要的是修好重复编码的那段代码,因为对方多解一次,可能会弄坏本来就含百分号的文本。
带中文的链接该选哪种方式?
对完整地址用“整个网址”,它会保留 :、/、? 和 &。如果是往链接里放一个值(比如搜索词),就只对这个值用“单个值”,否则值里的 & 或 # 会弄坏链接。

相关工具