在PHP中,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计算时,对待一个UTF8的中文字符是3个长度,所以“中文a字1符”长度是3*4+2=14,在mb_strlen计算时,选定内码为UTF8,则会将一个中文字符当作长度1来计算,所以“中文a字1符”长度是6 .
利用这两个函数则可以联合计算出一个中英文混排的串的占位是多少(一个中文字符的占位是2,英文字符是1)
echo (strlen($str) + mb_strlen($str,'UTF8')) / 2;
例如 “中文a字1符” 的strlen($str)值是14,mb_strlen($str)值是6,则可以计算出“中文a字1符”的占位是10.
PHP内置的字符串长度函数strlen无法正确处理中文字符串,它得 到的只是字符串所占的字节数。对于GB2312的中文编码,strlen得到的值是汉字个数的2倍,而对于UTF-8编码的中文,就是3倍的差异了(在 UTF-8编码下,一个汉字占3个字节)
补充:
里面代码如下(代码编码为UTF-8):
<?php
$str1 = 'www.111cn.net';
$str2 = '烟雨网';
$str3 = '烟雨网111cn.net';
echo mb_strlen($str1).'<br>';//结果15
echo mb_strlen($str2).'<br>';//结果6
echo mb_strlen($str3).'<br>';//结果17
echo '--------1-------------<br>';
echo strlen($str1).'<br>';//结果15
echo strlen($str2).'<br>';//结果6
echo strlen($str3).'<br>';//结果17
echo '--------utf-8-------------<br>';
echo mb_strlen($str1,'utf-8').'<br>';//结果15
echo mb_strlen($str2,'utf-8').'<br>';//结果3
echo mb_strlen($str3,'utf-8').'<br>';//结果14
echo '--------gbk-------------<br>';
echo mb_strlen($str1,'gbk').'<br>';//结果15
echo mb_strlen($str2,'gbk').'<br>';//结果5
echo mb_strlen($str3,'gbk').'<br>';//结果15
echo '--------gb2312-------------<br>';
echo mb_strlen($str1,'gb2312').'<br>';//结果15
echo mb_strlen($str2,'gb2312').'<br>';//结果5
echo mb_strlen($str3,'gb2312').'<br>';//结果16
?>
至此现在只得出两点结论:
1. 当为英文字母时,strlen和mb_strlen可以通用,编码不同,两个函数结果都是一样。
2. 当为中文时候,编码会影响字符的长度,就算是中文对于GBK和GB2312都是不同的表现。
3. 代码编码为UTF-8,否则得出的结果现象会和我的有出入,当为其他编码时候,比如为ANSI时结果值会为另外的值,而且需要注意的是,mb_strlen并不是PHP核心函数,需要加载扩展,代码结果如下:
(代码编码为ANSI)
<?php
$str1 = 'www.111cn.net';
$str2 = '烟雨网';
$str3 = '烟雨网111cn.net';
echo mb_strlen($str1).'<br>';//结果15
echo mb_strlen($str2).'<br>';//结果6
echo mb_strlen($str3).'<br>';//结果17
echo '--------1-------------<br>';
echo strlen($str1).'<br>';//结果15
echo strlen($str2).'<br>';//结果6
echo strlen($str3).'<br>';//结果17
echo '--------utf-8-------------<br>';
echo mb_strlen($str1,'utf-8').'<br>';//结果15
echo mb_strlen($str2,'utf-8').'<br>';//结果3
echo mb_strlen($str3,'utf-8').'<br>';//结果14
echo '--------gbk-------------<br>';
echo mb_strlen($str1,'gbk').'<br>';//结果15
echo mb_strlen($str2,'gbk').'<br>';//结果3
echo mb_strlen($str3,'gbk').'<br>';//结果14
echo '--------gb2312-------------<br>';
echo mb_strlen($str1,'gb2312').'<br>';//结果15
echo mb_strlen($str2,'gb2312').'<br>';//结果3
echo mb_strlen($str3,'gb2312').'<br>';//结果14
?>
另外,对于各个编码对字符长度的影响规律还在测试中,我把我的测试结果发在这里,欢迎知道的朋友告诉我,谢谢!