必须用 mb_strlen($str, 'utf-8'),因 strlen() 按字节计导致中文标点长度失真;需检查 mbstring 扩展启用、过滤非字符串输入,并可选正则统计中文标点数量。

PHP 8.0 判断含中文标点的字符串长度,核心就一条:用 mb_strlen($str, 'UTF-8'),别用 strlen()。
为什么必须用 mb_strlen 并显式指定 UTF-8
strlen() 按字节算,"你好。" 在 UTF-8 下占 3×3 = 9 字节,返回 9;但用户看到的是 3 个字符(2 汉字 + 1 中文句号)。mb_strlen() 按 Unicode 字符计数,只要编码传对,中文、中文标点(,。!?“”【】《》)、英文字母、数字、英文标点全部统一计为 1。
不写第二个参数会依赖 mb_internal_encoding() 设置,线上环境可能和本地不一致,容易出错。
确保 mbstring 扩展已启用
PHP 8.0 默认通常开启 mbstring,但部署环境可能关闭。上线前加一行检查:
if (!extension_loaded('mbstring')) { throw new RuntimeException('mbstring extension is required'); }
处理非字符串输入(如 null、数组、数字)
用户输入可能为空、为 null 或是数字类型,直接传给 mb_strlen() 在 PHP 8+ 会抛 TypeError。
安全写法是先判断类型再计算:
$len = is_string($input) ? mb_strlen($input, 'UTF-8') : 0;- 表单校验时建议配合
trim()去首尾空白,避免空格干扰长度判断
中文标点单独统计(按需)
如果业务需要知道「里面有几个中文标点」,不是总长度,那就另配正则:
preg_match_all('/[\x{3000}-\x{303f}\x{3099}-\x{309c}\x{30a0}-\x{30ff}\x{4e00}-\x{9fff}]/u', $str, $matches);$cn_punct_count = count($matches[0]);
注意:这个和「总字符长度」是两回事,别混用。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











