在 PHP 中,strlen 和 mb_strlen 都是求字符串长度的函数,但它们统计的维度不同。strlen 统计字节数,mb_strlen 可以按指定编码统计字符数。
先看例子:
<?php
$str = '中文a字1符';
echo strlen($str) . '<br>'; // 14
echo mb_strlen($str, 'utf8') . '<br>'; // 6
echo mb_strlen($str, 'gbk') . '<br>'; // 8
echo mb_strlen($str, 'gb2312') . '<br>';// 10分析:在 strlen 计算时,一个 UTF-8 中文字符占 3 个字节,所以“中文a字1符”的长度是 3 * 4 + 2 = 14。在 mb_strlen 计算时,如果选定编码为 UTF-8,则会将一个中文字符当作长度 1 来计算,所以“中文a字1符”的长度是 6。
利用这两个函数可以联合计算出一个中英文混排字符串的占位宽度:中文字符占位 2,英文字符占位 1。
<?php
echo (strlen($str) + mb_strlen($str, 'UTF-8')) / 2;例如“中文a字1符”的 strlen($str) 值是 14,mb_strlen($str) 值是 6,则可以计算出占位是 10。
PHP 内置的字符串长度函数 strlen 无法正确处理中文字符串,它得到的是字符串所占的字节数。对于 GB2312 编码的中文,strlen 得到的值是汉字个数的 2 倍;对于 UTF-8 编码的中文,则通常是 3 倍。