strlen、mb_strlen计算中英文混排字符串长度

在php中常见的计算字符串长度的函数有:strlen和mb_strlen,下面是对这两个函数的比较说明(编码方式UTF8)

比较strlen和mb_strlen

当字符全是英文字符的时候,两者是一样。这里主要比较一下,中英文混排的时候,两个计算结果。(测试时编码方式是UTF8)

$str='中文a字1符';
echo strlen($str);
echo '';
echo mb_strlen($str,'UTF8');
//输出结果
//14
//6

结果分析:在strlen计算时,对待一个UTF8的中文字符是3个长度,所以“中文a字1符”长度是 3*4+2=14。

在mb_strlen计算时,选定内码为UTF8,则会将一个中文字符当作长度1来计算,所以“中文a字1符”长度是6。

关于中英文混排串的占位符计算

利用这两个函数则可以联合计算出一个中英文混排的串的占位是多少(一个中文字符的占位是2,英文字符是1),计算的方法是:如果一个混排字符串有a个中文,b个英文,占位是:

$str='中文a字1符';
//计算如下
echo ( strlen($str) + mb_strlen($str,'UTF8') ) / 2;
//输出结果
//10

例如  “中文a字1符” 的strlen($str)值是14,mb_strlen($str)值是6,则可以计算出“中文a字1符”的占位是 10 。

最大占位计算

一般的英文字符占位要比中文小一些,例如,可能两个英文字符的宽度才是一个中文字符的宽度,所以,当我们允许 max 个中文字符宽度的时候,可以使用类似入如下的计算,计算总宽度:

$$
3*x + y = \text{strlen} \\
x + y = \text{mb_strlen} \\
2x = \text{strlen} – \text{mb_strlen} \\
x = \frac{\text{strlen} – \text{mb_strlen}}{2} \\
z*\frac{x}{x+y}*2 + z*\frac{y}{x+y} \le MAX \\
z \le \frac{MAX*(x+y)}{(2x+y)} = \frac{MAX*(\text{mb_strlen})}{(2x+y)} = \frac{MAX*(\text{mb_strlen})}{( \frac{\text{strlen} + \text{mb_strlen}}{2} )} \\
= \frac{2*MAX*(\text{mb_strlen})}{( \text{strlen} + \text{mb_strlen} )} \\
$$

Leave a Reply

Your email address will not be published. Required fields are marked *