应使用 mb_strlen($str, 'utf-8') 计算中文字符串长度,因 strlen() 按字节计数导致 utf-8 下汉字长度虚高;需确保输入编码确为 utf-8,且 php 已启用 mbstring 扩展。

PHP 里不能直接用 strlen() 算中文字符串长度,它按字节计数,UTF-8 下一个汉字占 3 字节,结果会严重偏大。
为什么 strlen() 对中文不准
它只数字节,不识别字符编码。比如 "你好" 在 UTF-8 编码下是 6 个字节,strlen("你好") 返回 6,但你实际想要的是字符个数 2。
常见错误现象:
- 表单校验提示“超出 10 字符”,用户只输了 4 个汉字就报错
- 截取字符串用
substr()配合strlen(),结果在中文处乱码或截断失败
该用 mb_strlen(),且必须指定编码
它才是真正按“字符”计算长度的函数,但默认编码依赖 mb_internal_encoding() 设置,线上环境常不一致,所以每次调用都应显式传 encoding 参数。
实操建议:
- 统一用
mb_strlen($str, 'UTF-8'),别省略第二个参数 - 确认你的 PHP 已启用
mbstring扩展(多数现代环境默认开启,但 Docker 或精简镜像可能没开) - 如果处理的是 GBK/GB2312 内容(如旧系统接口),改用
'GBK',否则返回0或 false
示例:
echo mb_strlen("Hello 世界", 'UTF-8'); // 输出 9
mb_strlen() 和 strlen() 的性能与使用场景差异
两者不是替代关系,而是分工不同:
-
strlen()极快,适合纯 ASCII 场景(如 token、base64、HTTP 头字段)或做内存/网络包长度预估 -
mb_strlen()有编码解析开销,但对普通 Web 表单、JSON 响应体等 UTF-8 文本是唯一可靠选择 - 不要在循环里反复调用
mb_strlen()判断长度——提前存到变量里
兼容性注意:PHP 5.6+ 默认支持,但低于 5.6 且未开启 mbstring 会致命报错 Call to undefined function mb_strlen(),上线前务必检查。
别忘了验证输入编码是否真为 UTF-8
mb_strlen() 不会自动转码,如果字符串其实是 GBK 编码却硬传 'UTF-8',结果不可预测(可能返回 0,也可能部分乱码计数)。
安全做法:
- 用
mb_detect_encoding($str, ['UTF-8', 'GBK', 'BIG5'], true)粗略探测(注意:不 100% 可靠,仅作参考) - 更稳妥的是在接收入口(如
$_POST)就统一转成 UTF-8:mb_convert_encoding($_POST['text'], 'UTF-8', 'auto') - 数据库连接、HTML 声明、PHP 文件保存编码,三者必须同为 UTF-8,否则从源头就乱了
最常被忽略的一点:即使代码里写了 mb_strlen($s, 'UTF-8'),如果 $s 来自一个没声明 charset 的 HTML 表单,或者从 GBK 数据库读出后没转码,那这个“UTF-8”参数就是自我欺骗。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











