自己写函数实现mb_strlen的功能

浏览:2849 发布日期:2014/04/04 分类:技术分享
今天周五,没心情工作,想随便写点东西分享一下,正好昨天看了pack()函数,其中讲到字节与编码相关的知识,其中讲到了一个小技巧,可以用来实现mb_strlen的功能。function mbstrlen($str,$encoding="utf8")  {
    $step = $encoding=="utf8"?2:1;
    $count = 0;//字数
    $strlen = strlen($str);
    for($i=0;$i<$strlen;$i++){
        $count++;
        if(ord($str{$i})>=128){
            $i=$i+$step;
        }
    }
    return $count;
}
解析:
mb_strlen我们一般用来统计一个字符串中的"字数",大家知道strlen()函数只能获得字符串的长度而不是字数。
比如$str = "我爱TP";
echo mb_strlen($str,"UTF-8");//输出4
echo strlen($str);//输出8,一个utf8汉字占3个字节长度
当mb_strlen没有开启时(这是一个扩展函数,不是php默认支持的),可以用我们上面的函数替代:echo mbstrlen($str);//输出4默认是utf8编码的,如果是gbk字符集,可以这样:echo mbstrlen($str,'gbk');//输出4所用到的核心原理就是 ord() 返回字符的ascii码,而汉字由多个字节组成,并且每个字节的ascii码都在128以上,所以我们只要获取每个字节的ascii码,判断它是否在128以上,是的话就根据编码往前跳过几个字节(UTF8是3,gbk是2)。这样最终就可以获得实际的字数。

=====
但是经楼主考察,这种方式可能只能对中英文混合并且不带特殊字符的字符串准确。当然网上有更好的替代方法,比如用正则统计。
最佳答案
评论( 相关
后面还有条评论,点击查看>>