You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Simple PHP中带&的字符串在URL参数中被意外编码如何解决?

问题原因

你遇到的是HTML实体自动解析问题,并不是字符串被编码为ASCII:

  • ¤是标准HTML实体,对应字符¤,你输出&currency时,浏览器会优先匹配前缀&curren做实体解析,剩余未匹配的cy直接拼接,最终显示为¤cy
  • 同理ð是对应字符ð的HTML实体,所以&ethnic会被解析为ðnic
    该问题通常出现在将URL查询参数直接输出到HTML页面(比如a标签href属性、页面文本)的场景。

修复方案

优先推荐:使用PHP原生函数处理

不要手动拼接参数,直接用http_build_query,它会自动处理参数的URL编码和分隔符规则,完全避免拼接错误:

// 直接生成符合HTTP规范的查询字符串
$param = http_build_query($pars);

如果需要把生成的查询字符串拼接到HTML的href等属性中,再套一层htmlspecialchars做HTML实体转义即可:

$url = 'https://example.com/?' . http_build_query($pars);
$htmlSafeUrl = htmlspecialchars($url);
// 输出到HTML页面
echo '<a href="' . $htmlSafeUrl . '">跳转链接</a>';

必须手动拼接的场景

你之前的写法错误在于:直接拼接&amp;作为分隔符,如果拼接后的字符串是用于发起HTTP请求而非输出到HTML,&amp;会被当作参数内容的一部分,自然会触发错误。正确的手动拼接逻辑:

  1. 先对每个参数的键、值做URL编码
  2. 拼接时用&作为分隔符
  3. 只有最终要输出到HTML上下文时,才对完整URL做HTML实体转义
$param = '';
foreach($pars as $key => $val) {
    if ($param !== '') {
        $param .= '&';
    }
    // 键值都做URL编码,避免特殊字符破坏参数结构
    $param .= urlencode($key) . '=' . urlencode($val);
}
// 仅当需要输出到HTML时才做转义
$htmlSafeParam = htmlspecialchars($param);

内容的提问来源于stack exchange,提问作者Jin Sun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 03:06:04