两个php函数,strlen和mb_strlen的区别。
大家都知道这两个函数都是获取字符串的长度,那么他们两个有什么区别呢,下面通过一个例子看看二者的区别。
$str = 'api连接成功';
var_dump(mb_strlen($str));// int 7
var_dump(strlen($str));// int 15
文件的编码UTF-8
从上面的例子可以看出,mb_strlen把一个中文字符的长度当成1
来计算,而strlen则把一个中文字符的长度当成3
来计算。
所以利用这两个函数可以计算一个中英文混合的字符串的占位长度,(一个中文字符占2,一个英文字符占1),在做计划任务时,如果要记录每一步的执行结果就可以用上。
比如下面这种情况下想要每一行日志记录都尽量长度一致(为了美观):
======================================api连接成功============================================= ==========================================已创建任务==================================== =========================================== 开始获取任务状态[1079948810] ============================= 第 1 次请求... ==========================================已经启动任务==================================== 第 2 次请求... ==========================================已经启动任务==================================== 第 3 次请求... ==========================================任务已经完成====================================
function getStrLength($str){
$len = 0;
if(!empty($str)){
$len = (strlen($str) + mb_strlen($str,'UTF8')) / 2;
}
return $len;
}
echo getStrLength($str); // 11
function writeCmdLog($str, $len=50){
$is_cli = PHP_SAPI == 'cli' ? 1 : 0;
$new_line_char = $is_cli ? PHP_EOL : "<br>";
if(!empty($str)){
$str_len = (int)floor((strlen($str) + mb_strlen($str,'UTF8')) / 2);
$len = $len - $str_len > 2 ? $len : $str_len + 4;
$mark_len = $len - $str_len;
$half_mark_len = (int)floor($mark_len / 2);
$mark_half = [];
$mark_half = array_pad($mark_half, $half_mark_len, '*');
$mark_half = implode('', $mark_half);
$str = $mark_half . $str . $mark_half;
}
echo $str . $new_line_char;
}
利用上面的函数就可以实现我们想要的效果。
PHP内置的字符串长度函数strlen无法正确处理中文字符串,它得 到的只是字符串所占的字节数。对于GB2312的中文编码,strlen得到的值是汉字个数的2倍,而对于UTF-8编码的中文,就是3倍的差异了(在 UTF-8编码下,一个汉字占3个字节)。
采用mb_strlen函数可以较好地解决这个问题。mb_strlen的用法和 strlen类似,只不过它有第二个可选参数用于指定字符编码。例如得到UTF-8的字符串$str长度,可以用 mb_strlen($str,'UTF-8')
。如果省略第二个参数,则会使用PHP的内部编码。内部编码可以通过 mb_internal_encoding()
函数得到。
需要注意的是,mb_strlen并不是PHP核心函数,使用前需要确保在php.ini中加载了php_mbstring.dll,即确保“extension=php_mbstring.dll”这一行存在并且没有被注释掉,否则会出现未定义函 数的问题。