URL 编码里空格为什么有时是 +,有时是 %20?
解释 URL 编码中 + 和 %20 的差别,以及 encodeURI、encodeURIComponent 的适用场景。
打开 URL 编码解码工具+ 和 %20 出现的位置不同
%20 是 URL 百分号编码里的空格表示。+ 常见于 application/x-www-form-urlencoded 表单编码,尤其是查询参数或表单提交场景。
因此看到 + 不一定错,关键要看这段字符串来自哪里、由谁解码。接口联调时,前后端需要约定使用同一种编码和解码方式。
encodeURI 和 encodeURIComponent 怎么选
encodeURI 适合编码完整 URL,它会保留 : / ? & = # 等 URL 结构字符。encodeURIComponent 适合编码单个参数值,会把更多特殊字符转义掉。
如果你要把“搜索关键词、回调地址、中文标题”放到 query 参数里,通常应该使用 encodeURIComponent。
- 完整链接整体编码:优先考虑 encodeURI。
- 单个参数值编码:优先使用 encodeURIComponent。
- 参数里包含 &、=、# 时必须谨慎,否则会被解析成 URL 结构。
中文参数的调试建议
中文在 URL 中通常会转成 UTF-8 百分号编码。复制接口地址时,如果经过 IM、文档系统或浏览器地址栏自动处理,可能出现重复编码。
排查时可以先解码一次看是否变成人类可读文本。如果解码后仍然是百分号串,说明可能被编码了两次。
常见问题
URL 编码可以重复解码吗?
不建议盲目重复解码。只有确认存在二次编码时才解码第二次,否则可能破坏原始内容。
为什么接口里的 + 变成了空格?
表单编码中 + 会被当成空格。如果原始内容需要保留 + 号,应编码为 %2B。
中文 URL 必须编码吗?
现代浏览器能显示中文 URL,但接口、日志和签名场景里建议统一编码,减少兼容问题。