当前位置:首页 > PHP教程 > php高级应用 > 列表

PHP strlen 和 mb_strlen 统计字符长度有什么差异

发布:smiling 来源: PHP粉丝网  添加日期:2026-10-23 14:43:51 浏览: 评论:0 

核心差异在于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

Tags: PHP strlen mb_strlen

分享到: