PHP中html_entity_decode处理UTF-8字符失效如何解决?
问题原因
- 实体对应字符不符
你代码里的‘、’是HTML的弯引号实体,解码后对应的是全角左单引号‘和全角右单引号’,不是你预期的半角英文单引号'。UTF-8编码下单个全角引号占3个字节,加上中间Dragon的6个字节,总长度为 3 + 6 + 3 = 12字节,和你strlen返回的结果完全一致。 - 单字节访问乱码
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
相关产品推荐
相关产品推荐

