要点:URL 编码(百分号编码)用 %XX 序列替换不安全字符,使链接在包含空格、重音字符和符号时仍能正常工作。空格变成 %20,& 变成 %26。关键在于知道何时对整条 URL 编码、何时只对单个查询值编码——以及 encodeURIComponentencodeURI 并不可互换。

一条 URL 只能安全地包含有限的字符集。其余一切——空格、重音字母,以及 ?&#= 等保留符号——都必须百分号编码,否则链接会失效或指向意料之外之处。

百分号编码究竟做什么

每个不安全字符都被替换为一个百分号加其十六进制字节值。空格是 %20,& 是 %26,问号是 %3F。解码则逆转此过程,把每个有效的 %XX 还原为原字符。

空格用 %20 还是 +

两者都可表示“空格”,但不在同一处。%20 是贯穿 URL 路径与查询的百分号编码空格。加号 + 只在 application/x-www-form-urlencoded 上下文(表单提交与查询串)中表示空格,其他地方按字面处理。拿不准时,%20 更安全、更通用。

encodeURIComponent 还是 encodeURI

这是最易绊倒人的区别。对放入 URL 的单个值用 encodeURIComponent——例如 ?q=hello%20world 中的搜索词。它会编码 &= 等保留字符,以免被当作 URL 结构。仅对完整 URL 用 encodeURI,此时那些保留字符需保留其结构含义。用 encodeURIComponent 编码整条 URL 会毁掉它自己的 ://?;用 encodeURI 编码单个参数则会让不安全字符 / 需要编码的字符未被转义。

何时编码

  • 从用户输入构建查询串时(搜索词、筛选项、名字)。
  • 把一个链接作为 ?redirect=?url= 参数放进另一个链接时。
  • 处理含空格或重音的文件名或路径时。
  • 调试在本地可用、一经分享就失效的链接时。

URL 编码不是 Base64

它们解决不同问题。百分号编码让不安全字符在 URL 内部安全;Base64 把二进制数据重新编码为紧凑的 ASCII 字符串,若放进链接,其输出仍需 URL 编码。选错就会得到看似已编码却无法工作的链接。

一个实用流程

把原始值粘贴到 URL 编码/解码器 来编码参数或解码可疑的 %XX 串——它解码有效序列,并对无效序列给出提示,而非默默破坏。若同一内容还要经过 Base64,用 Base64 编码/解码器 检查,以正确顺序应用两步。

需要避免的常见错误

  • encodeURIComponent 编码整条 URL,破坏其结构。
  • 以为 + 在 URL 任何位置都表示空格。
  • 重复编码——把已编码的串再次送进编码器。
  • 把百分号编码与 Base64 混为一谈。

编码各部分而非整体,含空格、重音或嵌套 URL 的链接就能完好送达。