1. 程式人生 > >PHP中mb_substr與mb_strcut完美解決擷取中文亂碼及兩者區別

PHP中mb_substr與mb_strcut完美解決擷取中文亂碼及兩者區別

方法一:
<?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()幾乎一摸一樣,只是多了一個指定字符集編碼的引數。函式原型為:

  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這一項

方法二:
<?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