URL 编码(百分号编码)完全指南:为什么中文会变成 %E4%BD%A0
把中文复制到浏览器地址栏,再复制出来就变成了 %E4%BD%A0%E5%A5%BD 这样的乱码。这不是乱码,是 URL 编码(也叫百分号编码)。本文讲清它的原理和规则。
一、为什么 URL 需要编码
URL 的设计只允许使用 ASCII 字符集里的安全字符(字母、数字和少数符号)。但现实中 URL 里会出现:
- 中文、日文等非 ASCII 字符——URL 标准根本不允许直接出现
- 保留字符:
&、=、?、/、#等在 URL 里有特殊含义,作为普通数据出现时必须编码,否则会破坏 URL 结构 - 空格、控制字符——URL 里不允许有空格
解决办法:把这些不安全的字符统一转成 % + 两位十六进制,这就是 URL 编码。
二、编码规则:% + 十六进制
编码分两步:
- 把字符按 UTF-8 编码成字节序列
- 每个字节写成
%+ 两位十六进制
以「你」为例:
- 「你」的 UTF-8 编码是 3 个字节:
E4 BD A0 - 每个字节加
%:%E4%BD%A0
所以「你好」(两个汉字,UTF-8 各 3 字节)编码后是 6 段:%E4%BD%A0%E5%A5%BD。这就是中文 URL 那么长的原因——一个汉字 = 9 个字符。
三、哪些字符必须编码
URL 字符分三类:
- 安全字符(不编码):
A-Z a-z 0-9和- _ . ~。这些直接出现。 - 保留字符(有歧义时编码):
: / ? # [ ] @ ! $ & ' ( ) * + , ; =。它们用于 URL 结构,作为数据时要编码,如&→%26、=→%3D。 - 不安全字符(必须编码):空格(
%20)、中文、以及所有控制字符。
四、常见字符编码对照
- 空格 →
%20(表单里也常见+) &→%26=→%3D?→%3F#→%23+→%2B- 中文「你」 →
%E4%BD%A0
五、三个常见踩坑
- 空格是 %20 还是 +:URL 路径里空格用
%20;表单 query 字符串里习惯用+。多数解码器两者都认,但严格场景要分清。 - 双重编码:把已编码的
%E4%BD%A0再编码一次,%变成%25,得到%25E4%25BD%25A0,解码一次还原不回来。后端接收时注意别重复编码。 - 编码字符集不一致:老系统用 GBK 编码中文(「你」→
%C4%E3),新系统用 UTF-8(%E4%BD%A0)。对接时先确认对方用哪种,否则解码出乱码。
六、在线编解码
手动算十六进制太麻烦,用本站URL 编解码工具:粘贴中文一键编码成百分号形式,或把 %XX 还原成原文,实时出结果。
常见问题
URL 编码和 Base64 是一回事吗?
不是。URL 编码解决「字符能否安全放进 URL」,Base64 解决「二进制能否用文本传输」。用途完全不同,别混用。
为什么有的中文 URL 不编码也能用?
现代浏览器会自动帮你在地址栏显示中文、提交时编码。肉眼看到的中文,实际传输时已变成 %XX。程序里拼接 URL 建议始终显式编码。
整个 URL 都要编码吗?
不是。只编码参数值等数据部分,协议、域名、路径分隔符 /、查询分隔符 ?&= 这些结构符号不能编。用 encodeURIComponent(编码值)而非 escape 整个 URL。
