必须显式传编码参数,因为省略时mb_strlen()依赖不稳定的mb_internal_encoding()设置,跨环境易不一致;推荐固定传'utf-8'确保中文、emoji等正确计数且行为可预测。

PHP 8.1 判断字符串长度,要用 mb_strlen(),并明确指定编码参数,推荐写死为 "UTF-8"。
为什么必须显式传编码参数
如果不传第二个参数,mb_strlen() 会依赖当前的内部编码(由 mb_internal_encoding() 决定),而这个值可能被意外修改,或在不同环境里不一致。PHP 8.1 没有改变这一行为,但更强调显式性——避免隐式依赖。
- 默认行为不可靠:内部编码可能不是 UTF-8,尤其在老项目或某些 SAPI(如 CLI)中
- 多语言场景下,中文、emoji、生僻字等必须用 UTF-8 才能正确计数
- 省略参数不报错,但结果易出错,属于“静默陷阱”
正确写法示例
始终把编码作为第二个参数传入:
$len = mb_strlen($str, 'UTF-8');
- ✅ 安全:无论
mb_internal_encoding()是什么,结果都确定 - ✅ 兼容:PHP 7.4–8.3 全系列行为一致
- ❌ 避免:
mb_strlen($str)或mb_strlen($str, null)(PHP 8.1+ 已不推荐传 null)
别和检测编码混淆
有人想先用 mb_detect_encoding() 猜编码再算长度,这反而增加风险:
-
mb_detect_encoding()是启发式猜测,不准确,尤其对短字符串或纯 ASCII 内容 - 现代 Web 场景中,输入/存储/传输基本统一为 UTF-8,没必要“猜”
- 若真遇到非 UTF-8 数据(如 GBK 表单),应在接收时就转码,而不是每次计算长度都检测
顺便注意 mb_check_encoding 的用途
它不是用来“获取长度”的,而是校验字符串是否符合某编码规范:
- 比如接收用户提交的 JSON 字段前,用
mb_check_encoding($input, 'UTF-8')排查乱码或注入风险 - 返回
true只说明字节流合法,不代表语义正确或长度可直接用
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











