php 8.3 中应使用 mb_strlen($str, 'utf-8') 获取真实字符数,中英文均计为1;需确保 mbstring 扩展已启用,否则会报错;若需按视觉宽度统计(如汉字计2、英文计1),则须手动加权遍历处理。

PHP 8.3 中计算字符串长度,关键在于区分「字节长度」和「字符长度」。中英文混合时,strlen() 仍按字节算(英文1字节、UTF-8中文3字节),而真正反映“人眼看到的字符个数”的,必须用 mb_strlen() 并明确指定编码。
直接用 mb_strlen() 获取真实字符数
这是最推荐、最简洁的方式,适用于绝大多数场景(如表单验证、显示截断、内容计数):
-
mb_strlen($str, 'UTF-8')→ 返回字符串中实际字符个数,中英文都算作 1 - 例如:
$str = "Hello你好";,mb_strlen($str, 'UTF-8')返回 8(5个英文字母 + 3个汉字) - 务必传入第二个参数(如
'UTF-8'),否则依赖默认内部编码,易出错
确认 mbstring 扩展已启用
PHP 8.3 默认不强制启用 mbstring,若调用 mb_strlen() 报错 Call to undefined function mb_strlen(),说明扩展未开启:
- Linux(php.ini):取消
;extension=mbstring前的分号,重启 Web 服务 - Windows(php.ini):确保
extension=php_mbstring.dll已启用 - 命令行验证:
php -m | grep mbstring应有输出
需要按“视觉宽度”或“等效字数”统计?需自定义逻辑
某些业务场景(如短信字数限制、排版占位)要求:1个中文 ≈ 2个英文。此时 mb_strlen() 不够用,得手动加权:
- 遍历每个字符,用
mb_substr($str, $i, 1, 'UTF-8')逐个提取 - 用
mb_ereg_match('^[\x{4e00}-\x{9fff}]+$', $char, 'u')或正则/^[\p{Han}]+$/u判断是否为汉字 - 是汉字则 +2,否则 +1,累加得“等效长度”
- 示例片段:// 汉字计2,其余计1
$len = 0;<br> for ($i = 0; $i $c = mb_substr($str, $i, 1, 'UTF-8');<br> $len += (preg_match('/^[\p{Han}]$/u', $c) ? 2 : 1);<br> }
不建议再用 strlen() 处理含中文的字符串
strlen() 在 PHP 8.3 中行为没变,仍是纯字节计数:
-
strlen("a")→ 1,strlen("中")→ 3(UTF-8下) - 混合字符串如
"Hi你好",strlen()返回 8(2+3+3),但用户感知是 4 个字符 - 仅在调试底层存储、计算网络传输量等极少数场景才需字节长度
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











