URL 编解码怎么用:encodeURIComponent 与 encodeURI 到底选哪个

一个复选框的区别,决定了链接还能不能正常打开

把中文或带空格的参数拼进网址,有时会变成一串 %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 · 更新于 2026年9月18日 · 阅读约 4 分钟