两个php函数,strlen和mb_strlen的区别。

17-02-14 10:59 字数 1856 阅读 2924 已编辑

大家都知道这两个函数都是获取字符串的长度,那么他们两个有什么区别呢,下面通过一个例子看看二者的区别。

$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”这一行存在并且没有被注释掉,否则会出现未定义函 数的问题。

0人点赞>
关注 收藏 改进 举报
0 条评论
排序方式 时间 投票
快来抢占一楼吧
请登录后发表评论