什么是 URL 编码?
URL(统一资源定位符)只允许使用特定的 ASCII 字符。当 URL 中包含空格、中文、特殊符号等不被允许的字符时,必须将其转换为 %XX 格式——这个过程就叫 URL 编码(也叫百分号编码,Percent-Encoding)。
例如:hello world 编码后变为 hello%20world,因为空格的 ASCII 十六进制值是 20。
为什么需要 URL 编码?
- 空格不合法:URL 中不允许有空格
- 特殊字符有歧义:
&、=、? 在 URL 中有特殊含义,若出现在参数值中需要编码
- 中文/非 ASCII 字符:URL 只支持 ASCII,中文需先转为 UTF-8 字节再做百分号编码
在线 URL 编码 / 解码工具
使用 tool.tl URL 编码工具 或 URL 解码工具,直接粘贴文本即可转换,支持批量处理:
- 打开 tool.tl/url-encoder(编码)或 tool.tl/url-decoder(解码)
- 在输入框粘贴需要转换的文本
- 结果实时显示在输出框中
- 点击「复制」即可使用
常见 URL 编码对照表
| 原始字符 | URL 编码 | 说明 |
| 空格 | %20 或 + | 在查询参数中也常用 + |
| ! | %21 | |
| # | %23 | URL 中 # 标识锚点 |
| % | %25 | % 本身需要编码 |
| & | %26 | 分隔查询参数 |
| / | %2F | 路径分隔符 |
| : | %3A | |
| = | %3D | 参数键值分隔符 |
| ? | %3F | 查询字符串开始标志 |
| @ | %40 | |
| 中(UTF-8) | %E4%B8%AD | 中文先转 UTF-8 字节再编码 |
URL 编码 vs Base64 编码:该用哪个?
| 对比项 | URL 编码 | Base64 编码 |
| 用途 | 在 URL 中传递特殊字符 | 将二进制数据编码为文本 |
| 输出字符 | %XX 格式 | A-Z、a-z、0-9、+/= |
| 可读性 | 较高(部分字符保留) | 低(完全不可读) |
| 长度 | 略长于原文 | 约增加 33% |
| 典型场景 | 查询参数、表单提交 | 图片/文件嵌入、API 传输 |
开发中常见的 URL 编码问题
双重编码
如果对已经编码过的 URL 再次编码,%20 会变成 %2520(% 被编码为 %25)。解码时需要注意是否被双重编码。
+ 与 %20 的区别
在 URL 查询参数中,+ 表示空格(application/x-www-form-urlencoded 格式),而 %20 是标准 URL 编码空格。在路径部分应使用 %20,不要用 +。
中文 URL 编码
中文字符先转为 UTF-8 字节序列,每个字节再用 %XX 表示。例如「中」的 UTF-8 编码为 E4 B8 AD,所以 URL 编码为 %E4%B8%AD。
常见问题(FAQ)
Q:URL 中的 %20 和 + 哪个表示空格?
A:两者都表示空格,但使用场景不同。%20 是标准 URL 编码,可以在 URL 的任何部分使用;+ 只在 HTML 表单提交(application/x-www-form-urlencoded)的查询参数中表示空格。
Q:JavaScript 中如何编码 URL?
A:用 encodeURIComponent() 编码单个参数值,用 encodeURI() 编码整个 URL(保留 ://?&= 等结构字符)。解码对应使用 decodeURIComponent() 和 decodeURI()。
Q:为什么有些 URL 含有中文,有些没有?
A:现代浏览器支持显示 IDN(国际化域名)和 Unicode 路径,会将 URL 编码后的中文在地址栏中还原为可读形式展示。实际传输时仍然使用编码格式。