PHP 7.4 中判断 UTF-8 字符串长度应使用 mb_strlen($str, 'UTF-8'),而非 strlen();需先用 mb_check_encoding($str, 'UTF-8') 验证合法性,避免非法序列导致错误。

PHP 7.4 中判断 UTF-8 字符串长度,不能直接用 strlen(),因为它返回的是字节数,不是字符数。中文、emoji 等多字节字符会被算作多个字节,导致结果错误。正确方式是使用 mb_strlen(),并明确指定编码为 'UTF-8'。
用 mb_strlen() 获取真实字符长度
mb_strlen() 是 PHP 多字节字符串处理函数,专为 UTF-8 等编码设计。在 PHP 7.4 中已默认启用 mbstring 扩展(只要没被禁用),可直接使用:
-
✅ 正确写法:
mb_strlen($str, 'UTF-8') -
⚠️ 注意:第二个参数
'UTF-8'必须显式传入,不能依赖内部编码设置(mb_internal_encoding()可能被修改,不保险) - 例如:
mb_strlen("你好?", 'UTF-8')返回 4(2个汉字 + 1个 emoji + 1个 emoji,共4个 Unicode 字符)
先验证是否为合法 UTF-8 字符串
如果输入来源不可靠(如用户提交、外部 API),建议先校验 UTF-8 合法性,避免 mb_strlen() 对非法序列返回意外结果:
- 用
mb_check_encoding($str, 'UTF-8')判断是否为有效 UTF-8 - 若返回
false,说明字符串含非法字节序列,可能需清理或拒绝处理 - 可组合使用:
if (mb_check_encoding($str, 'UTF-8')) { $len = mb_strlen($str, 'UTF-8'); }
避免常见坑
以下写法在 PHP 7.4 中容易出错,需避开:
立即学习“PHP免费学习笔记(深入)”;
-
strlen($str)→ 返回字节数,"你好" 会返回 6(每个汉字 3 字节),不是 2 -
mb_strlen($str)(缺编码参数)→ 依赖当前mb_internal_encoding(),可能因配置不同导致行为不一致 -
iconv_strlen($str, 'UTF-8')→ 虽可用,但不如mb_strlen稳定,且部分环境 iconv 不支持所有 Unicode 特性(如某些 emoji)
简单封装成安全函数(可选)
如项目中频繁使用,可封装一个健壮的 UTF-8 长度函数:
function utf8_length(string $str): int
{
if (!mb_check_encoding($str, 'UTF-8')) {
return 0; // 或抛异常、尝试转码等,按需处理
}
return mb_strlen($str, 'UTF-8');
}
调用:utf8_length("测试✅") → 返回 3



















