PHP中mb_substr与mb_strcut完美解决截取中文乱码及两者区别

方法一:
header("Content-Type: text/html; charset=utf-8");
$str="107sadf网站工作室欢迎您!";
echo strlen($str)."
"
; echo substr($str,0,12)."
"
; echo mb_strlen($str,"UTF8")."
"
; echo mb_substr($str,0,12,"UTF8")."
"
; ?>

显示结果如下
34
107sadf网�
16
107sadf网站工作室
strlen()函数返回字符串所占的字节长度,一个英文字母、数字、各种符号均占一个字节,它们的长度均为1。一个中文字符占两个字节,所以一个中文字符的长度是2,对于一个UTF-8的中文字符,会把它当做长度为3来处理。

怎么准确的计算字符串的长度呢?这里,得引入另外一个函数mb_strlen()。mb_strlen()函数的用法与strlen()几乎一摸一样,只是多了一个指定字符集编码的参数。函数原型为:

  1. int mb_strlen(string string_input, string encode); 
在mb_strlen计算时,选定内码为UTF8,则会将一个中文字符当作长度1来计算。

因此,使用mb_substr()的第二个length参数,要比substr小!如果使用substr的长度,有可能会不盲目的认为mb_substr不起作用!

mb_substr也同样的原理
注:mb_strlen与mb_substr并不是PHP的核心函数,使用前需要打开php.ini中的extension=php_mbstring.dll这一项

方法二:
header("Content-Type: text/html; charset=utf-8");
$str="107sadf网站工作室欢迎您!";
function chinesesubstr($str,$start,$len){
        $strlen = $len - $start;    //定义需要截取字符的长度
        for($i=0;$i<$strlen;$i++){                   //使用循环语句,单字截取,并用$tmpstr.=$substr(?,?,?)加起来
            if(ord(substr($str,$i,1))>0xa0){     //ord()函数取得substr()的第一个字符的ASCII码,如果大于0xa0的话则是中文字符
                $tmpstr.=substr($str,$i,3);        //设置tmpstr递加,substr($str,$i,3)3是指三个字符当一个字符截取(因为utf8编码的三个字符算一个汉字)
                $i+=2;
            }else{                                             //其他情况(英文)按单字符截取
                $tmpstr.=substr($str,$i,1);
            }

        }
        return $tmpstr;
}
echo chinesesubstr($str,0,12)."
"
; ?>

最后结果显示为:

107sadf网站

2.mb_strcut();

$length = strlen(strip_tags($this->nostriptagcon))-1;

// $randlength=rand(6,30);
// echo $this->nostriptagcon;


for($i=0;$i<$this->mactharrnums;$i++){
$this->shorttext[] =  mb_strcut($this->nostriptagcon, rand(0,$length),rand(12,30),"utf-8");
}

类似方式每次用mb_substr,有很多的数组内容为空白的,更换mb_strcut()之后,就很ok了!

两者的区别是:

    从上面的例子可以看出,mb_substr是按字来切分字符,而mb_strcut是按字节来切分字符,但是都不会产生半个字符的现象。


新增原文来自:https://www.cnblogs.com/blogforly/p/5657876.html


你可能感兴趣的:(php)