🔗

URL 编码与传参避坑

文本处理发布于 2026-10-09·阅读约 7 分钟

一、场景:参数到服务端就变样了

"我明明传了 a=1&b=2,后端只收到 a。"——十有八九是参数值里含未编码的特殊字符,把后面的参数吞掉了。URL 是一套严格语法:保留字符(&、=、?、#、空格等)出现在参数值里时必须转义,否则会被解析器当成语法的一部分。

二、两个编码函数,千万别用错

JavaScript 提供两个编码函数,差异经常被忽略:

  • encodeURIComponent:转义几乎所有保留字符,包括 & 和 =。用于编码单个参数值——这是 90% 场景的正确选择;
  • encodeURI:保留 URL 结构字符,用于编码整条 URL。如果拿它编码参数值,& 不会被转义,后端解析时参数就被截断了。

打开 URL 编解码 做个对照实验:输入 a=1&b=2,分别用两种模式编码,看输出里 & 是否变成 %26。解码同理——工具同时给出两种模式的互转结果。

三、高频坑清单

  • 空格变加号:表单(application/x-www-form-urlencoded)规则里空格编码为 +,而 encodeURIComponent 输出 %20。若用表单规则解码按标准规则编码的字符串,空格会变成加号。签名计算前务必统一编码规则;
  • 中文乱码:历史编码(GBK)与 UTF-8 混用导致。统一 UTF-8 后用解码工具验证:解码结果正常说明编码侧没问题,乱码则出在编码字符集;
  • # 后的内容丢失:井号是 fragment 分隔符,参数值里的 # 不编码的话,它后面的内容根本不会发到服务器。SPA 路由的 hash 也受此影响,路由参数务必编码;
  • 嵌套 JSON 参数:把 JSON 塞进参数的标准姿势:JSON 工具压缩 → encodeURIComponent → 拼接。服务端先按参数解码再 JSON.parse。任何一步漏掉编码,花括号引号都会破坏外层 URL 结构。

四、签名不匹配的排查

调用需要签名的第三方 API 时,最常见的失败原因是"签名的原文与服务端不一致"。排查方法:

  • 把待签名字符串完整粘贴到 URL 编解码 工具,看编码后的形态是否符合服务端文档要求(空格是 %20 还是 +、哪些字符不转义);
  • 对比请求实际发出的 URL(浏览器 Network 面板复制)与你的预期,差异点通常就是签名不一致的来源;
  • 涉及 Base64 的签名,用 Base64 编解码 核对填充与字符集(+ / 还是 - _)。

五、常见问题

  • 解码报错:孤立的 % 字符不是合法编码(必须跟两位十六进制),检查是否重复编码或手工拼接出错;
  • query 参数解析:URL 工具的解析模式可以直接拆出协议、主机、路径与全部参数键值对,比肉眼数 & 靠谱;
  • 双重编码:输出里出现 %2520 说明编码了两次(20 的 % 又被编码成 %25),排查哪一层多做了一次。

六、小结

URL 问题的万能排查法:把"你以为是的内容"和"实际发出的内容"都放到解码工具里对比,差异一目了然。规则记三条:参数值用 encodeURIComponent、统一 UTF-8、签名前核对编码规范。

本篇涉及的工具

继续阅读