php中url编码应按场景选择:查询参数用urlencode()(空格→+),路径段用rawurlencode()(空格→%20且编码/等字符);解码需严格对应;json接口无需url编码,直接json_encode()。

PHP里用 urlencode() 编码单个字符串参数
直接调用 urlencode() 就行,它专为 URL 查询参数设计,把空格转成 +,其他特殊字符转成 %XX 格式。注意它不编码 /、:、@ 这类 URL 保留字符——这是对的,因为你在拼接 query string,不是整个 URL。
常见错误是拿它去编码整个 URL(比如 https://example.com/path?x=1&y=2),结果把里面的 / 和 ? 也乱转一通,导致请求 400 或路由失败。
- 只用于键或值:例如
$url = "https://api.example.com/search?q=" . urlencode($keyword); - 中文、emoji、引号、空格都会被安全处理
- 返回字符串已完全符合 application/x-www-form-urlencoded 规范
要编码整个 URL 路径或含斜杠的部分,改用 rawurlencode()
rawurlencode() 更严格:空格变 %20(不是 +),且会编码 /、?、# 等所有非字母数字字符。适合构造 RESTful 路径参数或需要保留空格语义的场景。
比如你要把用户昵称嵌进路径:/user/张三/likes,必须用 rawurlencode(),否则 urlencode("张三") 得到 %E5%BC%A0%E4%B8%89 是对的,但如果你顺手给整个路径调用 urlencode(),连中间的 / 都变成 %2F,API 就收不到正确路由了。
- 路径段(path segment)必须用
rawurlencode() - 和
urlencode()的区别核心在空格:一个变+,一个变%20 - HTTP 协议层面两者都合法,但服务端解析逻辑往往依赖这个差异
别忘了解码:对应用 urldecode() 或 rawurldecode()
编码是双向操作。前端传来的 GET 参数默认已被 urlencode() 处理过,PHP 的 $_GET 会自动调用 urldecode(),所以通常不用手动解。
但如果你从 header、raw body 或自定义字段里拿到编码后的字符串(比如某个 webhook 的 X-Callback-Url 值),就得自己解。这时必须匹配编码方式:urlencode() 编的用 urldecode(),rawurlencode() 编的得用 rawurldecode(),混用会导致 + 解不出来或 %20 变成空格错乱。
-
urldecode("%E4%BD%A0%E5%A5%BD+world")→"你好 world" -
rawurldecode("%E4%BD%A0%E5%A5%BD%20world")→"你好 world" - 误用
urldecode("%20")得到的是" "(空格),但rawurldecode("+")不会变空格,会原样返回"+"
JSON API 场景下,别用 URL 编码传结构化数据
如果接口是 Content-Type: application/json,请求体是 JSON,那根本不需要 urlencode()。把中文、特殊字符直接写进数组再 json_encode() 就行。强行先 urlencode() 再塞进 JSON,等于套了两层编码,后端 json_decode() 出来是一串 % 开头的乱码。
典型翻车现场:用 file_get_contents() 发 POST,header 设了 application/json,但 body 却拼成 "name=".urlencode($name)."&age=".$age —— 这其实是 form-data 行为,服务端要么 415,要么解析出错。
- JSON 就走
json_encode($data),UTF-8 原生支持中文 - 表单提交(
application/x-www-form-urlencoded)才轮到urlencode() - 不确定时看接口文档写的
Content-Type和参数位置(query / body / path)
encodeURIComponent()(等价于 PHP 的 rawurlencode()),另一个硬套 urldecode(),空格和斜杠就先吵起来了。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











