1. 程式人生 > >PHP中substr擷取中文亂碼解決方案

PHP中substr擷取中文亂碼解決方案

方法一:
<?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也同樣的原理
注: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網站