把中文或带空格的参数拼进网址,有时会变成一串 %E4%BD%A0%E5%A5%BD,有时链接直接打不开;反过来拿到一串百分号,又想知道原文是什么。这背后就是 URL 编码(也叫百分号编码)。
麻烦的是:URL 编码有两种常用模式,用错了要么链接失效,要么参数被截断。这篇用 NBTools 的URL 编解码工具讲清楚两者区别与选用场景。工具在浏览器本地处理,内容不上传服务器。
两种模式:一个复选框的事
工具顶部有"编码/解码"切换,下方有一个关键复选框——「仅编码特殊字符(encodeURIComponent)」默认勾选:
| 模式 | 勾选状态 | 保留不编码的字符 | 适合编码什么 |
|---|---|---|---|
| encodeURIComponent | 勾选(默认) | 只保留字母数字和 - _ . ! ~ * ' ( ) | 单个参数值 |
| encodeURI | 取消勾选 | 额外保留 / ? : & = # 等 URL 结构字符 | 整条完整 URL |
同一个网址,两种结果
假设原始内容是 https://example.com/search?q=你好 world,两种模式输出完全不同:
- encodeURI(不勾选):
https://example.com/search?q=%E4%BD%A0%E5%A5%BD%20world
只把中文和空格转义,/ ? =都保留——所以它仍然是可以直接打开的合法网址。 - encodeURIComponent(勾选):
https%3A%2F%2Fexample.com%2Fsearch%3Fq%3D%E4%BD%A0%E5%A5%BD%20world
连:/?=都被转义,整串变成一个安全的"值",适合再作为另一个参数的值传递。
一句话记忆:要编码"整条网址"用 encodeURI(取消勾选);要编码"某个参数的值"用 encodeURIComponent(保持勾选)。 后者是默认,因为日常更多是拼参数。
为什么要给参数值用 encodeURIComponent
URL 里 & 用来分隔参数、= 用来分隔键值、? 和 # 有固定含义。如果参数值本身含有这些字符却不转义,URL 结构就会被破坏:
- 值里有
&:会被误认为是"下一个参数"的开始,后面的内容丢失。 - 值里有
#:会被当成锚点,#之后的内容根本不会发给服务器。 - 值里有
=:会让服务端把键和值切错位置。
所以用 encodeURIComponent 编码参数值,本质上是把值里可能破坏结构的字符全部"关进笼子",保证拼出来的 URL 语义正确。比如要传递一个回调地址:redirect=https%3A%2F%2Fa.com%2Fcb%3Fa%3D1%26b%3D2。
解码:还原原文
把"编码/解码"切到解码,粘贴带百分号的字符串,点"解码"即可得到原文。解码同样遵循上面选择的模式(encodeURIComponent 或 encodeURI),一般保持默认即可。
- 交换按钮:把结果填回输入框并自动切换编码/解码方向,方便来回验证。
- 复制结果:直接把结果复制到剪贴板。
如果字符串里有不合法的编码序列(比如 % 后面没跟两位十六进制),会提示"解码失败:含有非法编码序列"。多半是复制时被截断或已经被解码过一次——不要对同一串重复解码。
常见问题
该用哪种模式编码
编码整条网址用 encodeURI(取消勾选,保留 / ? = 等结构);编码某个参数的值用 encodeURIComponent(勾选,把 & = ? # / 全部转义)。工具默认勾选后者,因为拼参数更常见。
为什么编码后链接打不开了
通常是对整条 URL 用了 encodeURIComponent,导致 : 和 / 也被转义(变成 %3A%2F%2F),不再是合法网址。取消"仅编码特殊字符"复选框改用 encodeURI 即可。
中文是怎么变成百分号的
URL 编码先把字符串按 UTF-8 转成字节,再把每个非保留字节写成 %XX 形式。一个汉字通常占 3 个字节,所以"你"会变成 %E4%BD%A0 三组。
解码失败提示非法编码序列怎么办
检查字符串是否复制完整、是否含有孤立的 %,以及是否已经解码过(重复解码会报错)。确认后重新粘贴原始串再解码。
内容会上传吗
不会。编解码在浏览器本地完成,URL 与文本内容不上传服务器。
相关工具
- NBTools URL 编解码:https://nbtools.cn/tools/url
- 查询字符串解析:把 URL 查询参数拆成键值对
- URL 参数编辑器:解析完整 URL 并编辑查询参数
- Base64 编解码:另一种常见编码,注意二者用途不同