PHP正确统计中文字数以及截取字符串给超出的部分打点
许多的统计字数方法
PHP 中如何正确统计中文字数?这个是困扰我很久的问题,PHP 中有很多函数可以计算字符串的长度,比如下面的例子,分别使用了strlen
,mb_strlen
,mb_strwidth
这个三个函数去测试统计字符串的长度,看看把中文算成几个字节:
echo strlen("你好ABC123") . ""; //输出 12
echo mb_strlen("你好ABC123", 'UTF-8') . ""; // 输出 8
echo mb_strwidth("你好ABC123") . ""; //输出 10
从上面的测试,我们可以看出:
strlen
把中文字符算成 3 个字节,数字字母算一个字节;mb_strlen
不管中文还是英文数字,都算 1 个字节;mb_strwidth
则把中文算成 2 个字节,所以mb_strwidth
才是我们想要的:中文 2 个字节,英文 1 个字节,数字一个字节;
超出字数显示...
mb_strimwidth
,也是按照 中文 2 个字节,英文 1 个字节 方式计算之后的,并且如果字数超过截取的要求,这个函数还可以在最后面自动添加‘…’。width
将字符串str
截短。(PHP>=4)mb_strimwidth(string$str
,int$start
,int$width
,string$trimmarker
= "",string$encoding
= mb_internal_encoding()) :string
encoding
参数为字符编码。如果省略或是null
,则使用内部字符编码。trimmarker
,还将结尾处的字符替换为trimmarker
,并符合width
的宽度。【包含...在内一共width个数!】$text = 'this is my house! i love u';
$new = mb_strimwidth($text, 0, 10, '...', 'utf-8');
echo $new;
// 输出:this is... 包含空格 字母以及...一共10个字符长度
$text = '我是武斌,i am a web worker!';
$new = mb_strimwidth($text, 0, 11, '...', 'utf-8');
echo $new;
// 输出:我是武斌... 每个汉字=2个字节长度 + 3个点 2 * 4 + 3 = 11
注意,最后添加‘utf-8’
编码参数,可以避免中文截取乱码的问题。mb_strlen和mb_strimwidth都是如此!