PHP中mb_substr與mb_strcut完美解決擷取中文亂碼及兩者區別
阿新 • • 發佈:2019-01-14
方法一:
<?php header("Content-Type: text/html; charset=utf-8"); $str="107sadf網站工作室歡迎您!"; echo strlen($str)."<br>"; echo substr($str,0,12)."<br>"; echo mb_strlen($str,"UTF8")."<br>"; echo mb_substr($str,0,12,"UTF8")."<br>"; ?>
顯示結果如下
34 107sadf網� 16 107sadf網站工作室
strlen()函式返回字串所佔的位元組長度,一個英文字母、數字、各種符號均佔一個位元組,它們的長度均為1。一箇中文字元佔兩個位元組,所以一箇中文字元的長度是2, 對於一個UTF-8的中文字元,會把它當做長度為3來處理。
怎麼準確的計算字串的長度呢?這裡,得引入另外一個函式mb_strlen()。mb_strlen()函式的用法與strlen()幾乎一摸一樣,只是多了一個指定字符集編碼的引數。函式原型為:
- int mb_strlen(string string_input, string encode);
因此,使用mb_substr()的第二個length引數,要比substr小!如果使用substr的長度,有可能會不盲目的認為mb_substr不起作用!
mb_substr也同樣的原理
注:mb_strlen與mb_substr並不是PHP的核心函式,使用前需要開啟php.ini中的extension=php_mbstring.dll這一項
方法二:
<?php 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)."<br>"; ?>
最後結果顯示為:
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