PHP中substr擷取中文亂碼解決方案
阿新 • • 發佈:2019-02-16
方法一:
<?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也同樣的原理
注: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網站