PHP中文字串截斷無亂碼解決方法

2022-10-06 08:57:08 字數 2118 閱讀 5200

乙個比較好用的字串擷取函式:

function substring($str, $start, $length)

$len= ($len < strlen($str)) ? $len : strlen($str);

$tmpstr = "";

for ($i= $start; $i < $len; $i ++)

else

} if($length < 0) $tmpstr = strrev($tmpstr);

return $tmpstr;

}使用方法示例:

$str1 = '我是一串比較長的中文不帶英文';

$str2 = '我是一串比較長的中文帶yingwen';

$len = strlen($str1);

echo '

'.$len; //return 28

$len = strlen($str2);

echo '

'.$len; //return 29

echo '

';

echo substring($str1, 0, 11);

echo '

';echo substring($str2, 0, 11);

echo '

';echo substring($str1, 16, 28);

echo '

';echo substring($str2, 16, 29);

結果顯示:

2829

我是一串比較

我是一串比較

中文不帶英文

中文帶yingwen

這個函式十分有用,比如用來截斷比較長的檔名,但是要在中間加上...,可以這樣來做:

function formatname($str, $size) else

}另外,網上看到一種超級簡單的中文截斷解決方案,試用了一下,效果也不錯:

echo substr($str1,0,10).chr(0);

原理解釋:

chr(0)不是null

07null是什麼都沒有,而chr(0)的值是0。表示成16進製制是0x00,表示成二進位制是00000000

08雖然chr(0)不會顯示znbyc出什麼,但是他是乙個字元。

09當漢字被截斷時,根據編碼規則他總是要把後邊的其他字元拉過來一起作為漢字解釋,這就是出現亂碼的原因。而值為0x81到0xff與0x00組合始終都顯示為「空」

10根據這一特點,在substr的結果後面補上乙個chr(0),就可以防止出現亂碼了

----------------------------

20120705更新: 

以上方法雖好,但是偶爾還是會碰到亂碼,原因未深究。不過可以用以下的方法,對utf8字元文字屢試不爽。

注意:該方法中將漢字計算為1單位長度,英文乙個字母1單位長度,所以截斷時需要注意長度設定。

計算長度的方法:

function strlen_utf8($str)

elseif (substr($a, 0, 3) == 110) elseif (substr($a, 0, 4) == 1110)

程式設計客棧$n++;

} return $n;www.cppcns.com

} // end strlen_utf8;

字串截斷函式:

function substring_utf8($str, $start, $lenth)

elseif (substr($a, 0, 3) == 110) elseif (substr($a, 0, 4) == 1110)

$n++;

}elseelseif (substr($a, 0, 3) == 110) elseif (substr($a, 0, 4) == 1110) else

if (++$m >= $lenth)}}

return join($r);

} // end substring_utf8;

使用方法和之前介紹的一樣,比如formatname可以實現如下(這對漢字長度做了小優化):

function formatname($str, $size) else

}本文標題: php中文字串截斷無亂碼解決方法

本文位址:

PHP實現中文字元的無亂碼截斷

php內建的substr 函式不能對中文字元進行很好的截斷處理,對於一些中英文混合的字元會出現亂碼的情況。下面提供兩種解決函式。1 gb2312編碼方式的截斷 php function msubstr str,start,len else tmpstr substr str,i,1 return t...

PHP實現中文字元的無亂碼截斷

php 內建的substr 函式不能對中文字元進行很好的截斷處理,對於一些中英文混合的字元會出現亂碼的情況。下面提供兩種解決函式。1 gb2312編碼方式的截斷 functionmsubstr str,start,len else return tmpstr.2 utf8格式下的中文字元截斷 utf...

php使用iconv中文截斷問題的解決方法

今天做了乙個採集程式,原理很簡單,使用curl方法把對方頁面的html獲取分析,然後正則提取需要的資料並儲存在資料庫。由於對方頁面是gb2312編碼,而本地使用的是utf 8編碼。因此在採集後需要進行編碼轉換。使用了iconv方法進行編碼轉換 iconv 字串按要求的字元編碼來轉換 n程式設計客棧b...