要点:URL 编码(百分号编码)用 %XX 序列替换不安全字符,使链接在包含空格、重音字符和符号时仍能正常工作。空格变成 %20,& 变成 %26。关键在于知道何时对整条 URL 编码、何时只对单个查询值编码——以及 encodeURIComponent 与 encodeURI 并不可互换。
一条 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 的链接就能完好送达。