urlencode()将空格编码为+且适配表单提交,rawurlencode()按rfc 3986将空格编码为%20并保留/、~等uri字符,适用于url路径和标准化api对接。

PHP 中 urlencode() 和 rawurlencode() 都用于对字符串进行 URL 编码,但它们遵循的规范不同,导致关键字符的处理方式有明显差异。
空格编码方式不同
这是最直观、最常踩坑的区别:
-
urlencode()把空格转成 +(比如"hello world"→"hello+world") -
rawurlencode()把空格转成 %20(比如"hello world"→"hello%20world")
特殊符号的编码范围不同
两者对非字母数字字符的“放行”策略不一致:
-
urlencode()不编码~,但会编码/、.、-等部分符号;它更偏向传统表单提交格式(application/x-www-form-urlencoded) -
rawurlencode()严格遵循 RFC 3986 标准:不编码~、/、.、-、_、:等 URI 保留字符,只对真正需要转义的字符(如中文、空格、?、#、&)做%XX编码
适用场景不一样
选错函数可能导致 API 调用失败、路径解析错误或跨系统对接异常:
- 用在 URL 路径或查询参数值(例如
https://api.example.com/user/张三?name=李四&tag=php+dev)→ 推荐rawurlencode() - 模拟 HTML 表单 POST 提交(
Content-Type: application/x-www-form-urlencoded)→ 可用urlencode(),因为浏览器表单默认就用+表示空格 - 对接外部 API(尤其是地图、支付、OAuth 等标准化服务)→ 必须用
rawurlencode(),否则像~或空格被误传,可能引发定位偏移、签名失败等问题
解码必须配对使用
编码和解码函数要一一对应,否则结果不可靠:
-
urlencode()→ 对应urldecode() -
rawurlencode()→ 对应rawurldecode() - 混用会导致
+被当成空格解出,或%20未被识别而原样保留
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











