php 8.0 中必须显式指定 mb_strlen() 的字符编码参数,如 mb_strlen($str, 'utf-8'),否则触发警告且长度计算错误;编码需准确匹配字符串实际编码,避免使用 mb_detect_encoding;需检查返回值是否为 false 并处理非法 utf-8。

PHP 8.0 中用 mb_strlen() 判断字符串长度,核心是**指定正确的字符编码**,否则可能返回错误结果或警告。
必须指定字符编码参数
PHP 8.0 默认关闭了 mbstring.func_overload(早已废弃),且 mb_strlen() 不再默认使用内部编码。不传第二个参数会触发 E_WARNING,并可能按单字节计算(如把一个中文算作 3 个长度)。
- ✅ 正确写法:
mb_strlen($str, 'UTF-8') - ❌ 错误写法:
mb_strlen($str)(PHP 8.0+ 报 Warning,结果不可靠)
常见编码要写对
根据字符串真实编码选择参数,否则长度会错:
- 网页/JSON/现代系统大多用
'UTF-8' - 旧 Windows 环境可能用
'GBK'或'GB2312' - 不能写成
'utf8'(少横杠)、'utf-8'(大小写敏感,官方推荐小写带横杠)
配合 mb\_detect\_encoding 要谨慎
自动检测编码不可靠,尤其混合内容时容易误判。不建议用于生产环境的长度判断:
- ⚠️ 避免:
mb_strlen($str, mb_detect_encoding($str)) - ✅ 推荐:明确知道来源就硬编码,如
mb_strlen($name, 'UTF-8')
注意 null 字节和二进制数据
mb_strlen() 遇到 \0 不会截断(和 strlen() 不同),但若字符串含非法 UTF-8 序列,可能返回 false:
- 检查返回值:
$len = mb_strlen($str, 'UTF-8'); if ($len === false) { /* 处理编码错误 */ } - 清理输入:入库或显示前先用
mb_convert_encoding($str, 'UTF-8', 'UTF-8')校验修复
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











