URL 编码解码常见错误:%20、%25、中文乱码怎么处理
URL 编码看起来简单,但参数一多,就很容易出现 %25、中文乱码、解码报错、参数被截断。
大多数问题来自把完整 URL、查询参数值、已经编码过的字符串混在一起处理。
编码参数值,不要乱编码整个 URL
参数值适合用组件编码:
const q = encodeURIComponent('red shoes & socks');
这样 & 不会被误认为查询参数分隔符。
不要无脑对完整 URL 使用 encodeURIComponent(),否则 https://、/、?、& 都会被编码掉。
注意重复编码
重复编码会把 %20 变成 %2520:
space -> %20 -> %2520
如果你看到 %25,很可能是值已经编码过,又被编码了一次。
百分号不完整会解码失败
如果字符串里有非法百分号转义或非法 Unicode 序列,解码时可能抛出 URIError。
这些输入都值得警惕:
abc%
abc%2
abc%ZZ
空格、加号和查询参数
空格可能写成 %20,也可能写成 +,具体取决于上下文。普通 URL 编码里 %20 更明确;表单风格的查询编码里,+ 经常会被解释成空格。
这会影响搜索词、邮箱、优惠码、Base64 风格字符串等参数。如果查询参数里本来就需要一个真正的加号,通常要编码成 %2B,否则解码后可能变成空格。
排查清单
URL 出问题时,不要把整条链接当成一个字符串乱处理,先拆开看:
| 部分 | 要检查什么 |
| ---------- | --------------------------------------- |
| 完整 URL | 协议、域名、路径、查询分隔符、hash。 |
| 查询 key | key 本身是否需要编码。 |
| 查询 value | 用户输入应该用 encodeURIComponent()。 |
| 已编码值 | 除非有意,否则不要再编码 %。 |
在代码里拼 URL 时,能用 URL 和 URLSearchParams 就尽量用。它们可以减少 ?、&、=、空格和 Unicode 相关的手写错误。
简短结论
查询参数值用 encodeURIComponent(),不要重复编码已经编码过的值;解码前检查不完整的 % 序列。如果解码报错,说明输入不是合法 URL 编码。
参考资料: