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

PHP中html_entity_decode处理UTF-8字符失效如何解决?

问题原因

  1. 实体对应字符不符
    你代码里的‘、’是HTML的弯引号实体,解码后对应的是全角左单引号‘和全角右单引号’,不是你预期的半角英文单引号'。UTF-8编码下单个全角引号占3个字节,加上中间Dragon的6个字节,总长度为 3 + 6 + 3 = 12字节,和你strlen返回的结果完全一致。
  2. 单字节访问乱码
    PHP原生的字符串下标访问、strlen函数都是按单字节处理的,你直接访问$tt1[0]只会拿到全角左单引号3个字节中的第一个字节,无法组成完整的UTF-8字符,所以会出现乱码。Chrome浏览器显示正常是因为浏览器会按完整的UTF-8编码规则解析整个字符串,三个字节会被正确识别为全角引号。

解决方案

方案1:将弯引号转为半角单引号,获得长度为8的结果

如果你就是需要得到半角单引号包裹的'Dragon',可以在解码前先替换实体:

$tt="‘Dragon’";
// 把弯引号实体替换为半角单引号实体
$tt = str_replace(['‘', '’'], ''', $tt);
$tt1=html_entity_decode($tt);
echo $tt1." ".strlen($tt1); // 输出结果:'Dragon' 8

方案2:正确操作UTF-8编码的字符串

如果你需要保留全角弯引号,操作字符串时要用MB_STRING扩展的多字节处理函数,不要用原生的单字节操作方式:

$tt="‘Dragon’";
$tt1=html_entity_decode($tt);
// 取第一个字符用mb_substr,指定编码为UTF-8
$first_char = mb_substr($tt1, 0, 1, 'UTF-8');
echo $first_char; // 正常输出 ‘
// 计算多字节字符串长度用mb_strlen
echo mb_strlen($tt1, 'UTF-8'); // 输出 8,对应2个引号+6个字母的字符数

内容的提问来源于stack exchange,提问作者saurabh yadav

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 02:45:02