ToolBench

Web

URL 编码与解码

这两个函数不能混用。encodeURI 会保留 :/?#&=,适合整条 URL;encodeURIComponent 会把它们也转义,适合单个参数值。

结果显示在这里。

怎么用

  1. 粘贴一条 URL,或单独的参数值。
  2. 整条 URL 用 encodeURI,查询串里的单个值用 encodeURIComponent。
  3. 用「解码」把 %20、%E4%B8%AD 还原成可读文本。

encodeURI 和 encodeURIComponent 的区别

encodeURI 不碰 / ? & = 这些保留字符,所以它用于编码一个结构本身已经正确的完整网址。encodeURIComponent 会把这些也转义,所以它用于编码一个即将放进查询串或路径段里的单个值。用错哪一个,正是参数悄悄破坏网址结构的常见原因。

空格是加号还是 %20?

在查询串里,+ 历史上代表空格——这个约定来自 HTML 表单提交。在路径段里,+ 就是字面的加号,空格必须写成 %20。很多服务器两种都收,这恰恰是这个 bug 能活过测试、只在严格实现上暴露的原因。

编码一个参数,而不是整个网址

最常见的错误是把整条 URL 丢进编码器。结果连冒号和斜杠都被编码,服务器会把它当成一整段不透明的路径。正确做法是只编码参数值,再拼回去:/search?q= 加上编码后的值。

另一个坑是加号。在查询字符串里,按表单编码规则 + 表示空格,所以真正的加号必须写成 %2B;而在路径段里,+ 就是加号本身。搜索「C++」在那些把查询串规则套用到全站的框架里会出错——而大多数框架正是这么做的。

常见问题

%20 和 + 有什么区别?

%20 是空格在 URL 任意位置的百分号编码;加号只在表单提交体里表示空格。

为什么中文会变成一长串百分号?

每个 UTF-8 字节变成一个 %XX,一个汉字占三个字节,就是九字符编码。这是正常且正确的。

路径里的斜杠需要编码吗?

不需要。斜杠是路径分隔符,编成 %2F 会把含义变成片段内的字面斜杠,很多服务器会直接拒绝。

把网址放进二维码之前需要编码吗?

不需要,只编码参数部分。整条编码后依然能扫,但对面收到的是一段无意义的路径,而不是一条路由。

为什么中文会变成 %E4%B8%AD 这样?

一个汉字是三个 UTF-8 字节,每个字节变成一个 %XX。所以短短一句中文,编码后看着很长。