URL 解码和编码怎么用
- 解码:粘贴网址或任意百分号编码文本,例如
%E5%8C%97%E4%BA%AC,马上就能看到“北京”。 - 完整网址还会被拆开:协议、主机名(中文域名同时显示 Unicode 形式)、路径、片段,以及逐个解码的查询参数表。
- “把 + 当作空格”对查询字符串和表单数据保持勾选,因为那里的 + 代表空格;其他文本里 + 就是加号,可以取消勾选。
- 编码:选择编码,输入文本,再选编码方式:网址的一部分(给查询参数值用,最常用)、整个网址、表单数据或严格 RFC 3986。
- 点击结果旁的复制。格式不对的 % 会指出它在第几个字符。
百分号编码的原理
网址里只能出现一小部分 ASCII 字符,其中有些还有特殊用途:/ 分隔路径,? 开始查询字符串,& 和 = 分隔参数,# 开始片段。其他字符——包括所有汉字——以及当作普通数据使用的这些符号,都要写成百分号加两位十六进制数,表示一个字节。这就是 RFC 3986 定义的百分号编码,也叫 URL 编码。
空格是字节 32,十六进制 20,所以写成 %20。非 ASCII 字符先转换成 UTF-8 字节,再给每个字节一个编码:常用汉字在 UTF-8 里占 3 个字节,所以“中”变成 %E4%B8%AD,“你好”变成 %E4%BD%A0%E5%A5%BD;大多数 emoji 占 4 个字节。解码就是反过来:每个编码变回一个字节,再把这些字节按 UTF-8 读成文字。字母、数字和 - . _ ~ 永远不需要编码,十六进制字母大小写都可以。
GBK 编码的网址和中文乱码
不是所有中文网址都用 UTF-8。一些老网站、老系统和部分搜索引擎链接用 GB2312/GBK 编码汉字:每个汉字 2 个字节,而不是 UTF-8 的 3 个。比如“你好”在 UTF-8 里是 %E4%BD%A0%E5%A5%BD(6 个编码),在 GBK 里是 %C4%E3%BA%C3(4 个编码)。很多在线 URL 解码工具只会按 UTF-8 解码,遇到 GBK 就输出一串 �� 或乱码。
本工具先按 UTF-8 解码;如果这些字节不是合法的 UTF-8,就自动改用 GBK/GB18030 再试一次,并在结果里注明所用的字符集。所以:
%C4%E3%BA%C3解码为“你好”,字符集显示为 GBK / GB18030;%D5%FD%D4%F2%B1%ED%B4%EF%CA%BD解码为“正则表达式”。
链接里如果带有 ie=gbk、charset=gb2312 这类参数,基本可以确定是 GBK 编码,请以“解码结果”一栏为准。反过来的情况也很常见:UTF-8 的文字被当成 GBK 显示,“北京烤鸭”就会变成“鍖椾含鐑ら腑”这样的乱码。遇到这种乱码,回到原始的百分号编码重新解码,就能得到正确的中文。GB18030 是 GBK 的超集,是国家强制标准,这里的 GBK 解码同时覆盖两者。
encodeURIComponent、encodeURI 还是表单编码?
四种编码方式的区别在于哪些字符保持原样:
| 字符 | 网址的一部分(encodeURIComponent) | 整个网址(encodeURI) | 表单数据 | 严格 RFC 3986 | |
|---|---|---|---|---|---|
| 半角空格 | %20 | %20 | + | %20 |
| 全角空格 | %E3%80%80 | %E3%80%80 | %E3%80%80 | %E3%80%80 |
中 | 汉字 | %E4%B8%AD | %E4%B8%AD | %E4%B8%AD | %E4%B8%AD |
, | 全角逗号 | %EF%BC%8C | %EF%BC%8C | %EF%BC%8C | %EF%BC%8C |
# | 井号 | %23 | # | %23 | %23 |
% | 百分号 | %25 | %25 | %25 | %25 |
& | 和号 | %26 | & | %26 | %26 |
+ | 加号 | %2B | + | %2B | %2B |
/ | 斜杠 | %2F | / | %2F | %2F |
= | 等号 | %3D | = | %3D | %3D |
? | 问号 | %3F | ? | %3F | %3F |
~ | 波浪号 | ~ | ~ | %7E | ~ |
😀 | emoji | %F0%9F%98%80 | %F0%9F%98%80 | %F0%9F%98%80 | %F0%9F%98%80 |
- 网址的一部分就是 JavaScript 的
encodeURIComponent(Java 的URLEncoder与它接近,但把空格写成 +)。它会编码所有在网址里有特殊含义的字符,所以结果可以安全地作为一个查询参数值或一段路径,甚至把整个网址放进另一个网址的参数里,例如回调地址redirect_uri。 - 整个网址是
encodeURI,会保留; , / ? : @ & = + $ #,所以完整链接仍然可用;适合清理链接里的空格和汉字,但不要用它编码可能包含&的单个参数值。 - 表单数据是浏览器提交表单的方式(
application/x-www-form-urlencoded):空格变成+,! ' ( ) ~也会编码。 - 严格 RFC 3986在 encodeURIComponent 的基础上再编码
! ' ( ) *,OAuth 签名和一些开放平台接口的签名算法要求这样做。
注意全角字符:全角空格“ ”和全角逗号“,”都是普通的非 ASCII 字符,会被编码成三个字节,而不是 %20 或 %2C。接口参数对不上时,先检查是不是混进了全角符号。
+ 还是 %20?
两者都可能表示空格,但只在查询字符串里成立。表单编码把空格写成 +,所以搜索链接常常是 ?q=red+shoes;RFC 3986 把空格写成 %20,在路径里 + 就是加号。查询参数值里真正的加号必须写成 %2B:C%2B%2B 解码为“C++”,而 C++ 在勾选“把 + 当作空格”时会变成 C 加两个空格。
双重编码
已经编码过的文本再编码一次,每个 % 都会变成 %25:“你”先变成 %E4%BD%A0,再变成 %25E4%25BD%25A0。链接经过两个系统、各自编码一次时就会这样,常见于跳转链接、短链和统计参数。解码器会在还有百分号编码时继续解码,并显示一共有几层:%25E4%25BD%25A0%25E5%25A5%25BD 有 2 层,最终得到“你好”。取消勾选该选项,可以一次只解一层。
计算示例
输入框里的示例是一个搜索链接:https://www.example.cn/search?q=%E5%8C%97%E4%BA%AC%E7%83%A4%E9%B8%AD&city=%E5%8C%97%E4%BA%AC+%E6%9C%9D%E9%98%B3&next=%2Fmenu%3Fpage%3D2#pinglun。里面有 27 个百分号编码,只有一层。解码后是:
https://www.example.cn/search?q=北京烤鸭&city=北京 朝阳&next=/menu?page=2#pinglun
主机名是 www.example.cn,路径是 /search。查询参数表列出 3 个参数:q =“北京烤鸭”,city =“北京 朝阳”,next =“/menu?page=2”。“北京烤鸭”四个字占 12 个编码,每个汉字 3 个字节;city 里的 + 变成了空格。最后一个参数本身是带查询的路径,所以它的 /、?、= 都被编码了:如果不编码,那个 = 会让参数提前结束。片段 #pinglun 不会发送给服务器。
中文域名
中文域名在网络上传输时使用一种叫 Punycode(RFC 3492)的 ASCII 形式,以 xn-- 开头。例如 中国.cn 写作 xn--fiqs8s.cn。粘贴任意一种形式,拆解结果都会同时显示浏览器实际发送的主机名和 Unicode 形式。Punycode 不是百分号编码,域名里永远不会出现 % 编码。
常见错误
- % 后面不是两位十六进制数——比如“打折 50%”,或者被截断的编码——无法解码,提示会给出它的位置。百分号本身写作
%25。 - 解码后出现 ��:说明字节不是 UTF-8,多半是 GBK。本工具会自动改用 GBK,其他工具可以先试试本页。
- 编码后签名不对:检查对方要求的是
%20还是+,以及! ' ( ) *是否需要编码(严格 RFC 3986)。
小技巧与限制
- 拼接查询字符串时,先分别编码每个参数值,再用
&和=连起来;如果对拼好的整串用 encodeURIComponent,分隔符也会被编码。 - 百分号编码不是加密,任何人都能解码。不要把密码或令牌放进要分享的链接里。
- JSON 格式的接口参数解码后,可以用 JSON 格式化查看;需要从链接里批量提取内容时,可以用正则表达式在线测试。
解码和编码都在你的浏览器里完成:粘贴的内容不会上传,也不会保存,刷新页面就会清空。链接里经常带有登录令牌或个人信息,这一点很重要。
常见问题
URL 里的 %E4%BD%A0 是什么意思?
这是汉字“你”的 UTF-8 编码:E4、BD、A0 三个字节,每个字节前面加一个 %。把整个网址粘贴到这里,就能把所有编码还原成中文。
为什么有的 URL 解码后是乱码?
最常见的原因是链接用 GBK(GB2312)编码,而解码工具按 UTF-8 读取。本工具会在 UTF-8 不合法时自动改用 GBK/GB18030,并注明所用的字符集。如果原文就是被错误转码过的文字,需要找到最初的编码才能还原。
为什么网址里会出现 %2520?
它被编码了两次。第一次空格变成 %20,第二次 % 本身变成 %25。解码器会识别并逐层还原。
encodeURI 和 encodeURIComponent 有什么区别?
encodeURI 用来编码完整网址,保留 / ? & = # 这些构成网址结构的字符;encodeURIComponent 用来编码网址的一部分——一个参数值或一段路径——会把这些字符也编码,避免它们破坏外面的网址。
网址里的 + 是空格吗?
在表单数据的查询字符串里是:?q=red+shoes 表示“red shoes”。在其他地方和 RFC 3986 编码里,+ 就是加号,空格写成 %20。查询参数里要传加号,请写成 %2B。
我粘贴的网址会被上传吗?
不会。页面用浏览器里的 JavaScript 完成解码和编码,不向服务器发送任何内容,也不保存你粘贴的内容。
最后更新:2026年10月16日