核心差异在于strlen统计字节数、mb_strlen统计字符数;前者在utf-8下将“你好”计为6字节,后者按编码识别字符边界,如mb_strlen("你好","utf-8")返回2。

核心差异在于:strlen 统计的是字节数,mb_strlen 统计的是字符数——前提是正确指定编码。
strlen 只认字节,不识字符
它把字符串当成一串原始字节来数,不管内容是英文、数字还是中文。在 UTF-8 编码下,一个中文字符占 3 个字节,所以:
- "你好" → strlen 返回 6(2 个字符 × 3 字节)
- "abc" → strlen 返回 3(每个字母占 1 字节)
- "中文a1" → strlen 返回 3+3+1+1 = 8
它无法区分“一个汉字”和“三个连续字节”,因此在含中文、日文、emoji 等多字节字符的场景中,结果不是你想要的“长度”。
mb_strlen 按字符单位计算,但依赖编码参数
它会根据指定的字符编码(如 'UTF-8'、'GBK')识别多字节序列边界,真正按“人眼看到的字符个数”来算:
- mb_strlen("你好", "UTF-8") → 返回 2
- mb_strlen("你好", "GBK") → 返回 2(GBK 中一个汉字占 2 字节,仍为 1 字符)
- mb_strlen("a€??", "UTF-8") → 返回 4(字母、欧元符号、emoji 家庭都是独立字符)
⚠️ 注意:如果不传第二个参数,mb_strlen 会使用 PHP 内部编码(可用 mb_internal_encoding() 查看),而该编码可能不是 UTF-8,导致结果出错。
常见误用与关键前提
- mbstring 扩展必须启用:php.ini 中需开启 extension=mbstring,否则调用 mb_strlen 会报“未定义函数”
- 文件保存编码要匹配:PHP 源文件若存为 UTF-8,但用 mb_strlen('中文', 'GBK') 计算,结果可能异常(如返回 3 或乱码)
- 不能混用逻辑:用 strlen 截取、用 mb_strlen 判断长度,极易导致截断错位或乱码——应全程统一使用 mb_ 系列处理多字节文本
怎么选?看用途
- 判断表单输入是否超 20 个“字”?→ 用 mb_strlen($str, 'UTF-8')
- 计算 JSON 字符串传输体积?→ 用 strlen($json)(JSON 是字节流)
- 需要中英文混合占位估算(中文占 2 位、英文占 1 位)?→ 可组合:(strlen($str) + mb_strlen($str, 'UTF-8')) / 2
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











