php substr是一種基於php語言開發的可以傳回字串的一部分的函數。有時候我們使用php substr會出現一些亂碼問題,那該如何解決呢?
string substr ( string $string , int $start [, int $length ] )
返回string中從start位置開始長度為length的字串
substr函數在截取字元時是按字節來截取的,中文字元在GB2312編碼時為2個字節,utf-8編碼時為3個字節,所以截取指定長度的字串時如果截斷了漢字,那麼返回的結果顯示出來便會出現亂碼。
查了一下,解決方案歸結起來可分兩類:
##1、改用mb_substr()函數string mb_substr ( string $str , int $start [, int $length [, string $encoding ]] )類似substr()函數,只是計數以字元數來計,確保字元安全使用mb_substr()函數可保證不會出現亂碼,但缺點是長度統計變成了字元數統計,而不是按位元組數統計。用於顯示時,同樣長度的中文結果和英文結果會出現較大的顯示長度的差異。 2、自建函數增強substr功能這裡提供一個函數可較好解決substr遇到中文字元的問題。中文字符以2個長度單位來計算,使得中英文混用環境下字符串截取結果最後的顯示長度接近;捨棄最後一個不完整字符,保證不會出現顯示上的亂碼;且兼容了中文字符常用的utf -8編碼和GB2312編碼,有很好的通用性。 查看原始碼
function getstr($string, $length, $encoding = 'utf-8') { $string = trim($string); if($length && strlen($string) > $length) { //截断字符 $wordscut = ''; if(strtolower($encoding) == 'utf-8') { //utf8编码 $n = 0; $tn = 0; $noc = 0; while ($n < strlen($string)) { $t = ord($string[$n]); if($t == 9 || $t == 10 || (32 <= $t && $t <= 126)) { $tn = 1; $n++; $noc++; } elseif(194 <= $t && $t <= 223) { $tn = 2; $n += 2; } elseif(224 <= $t && $t < 239) { $tn = 3; $n += 3; $noc += 2; } elseif(240 <= $t && $t <= 247) { $tn = 4; $n += 4; $noc += 2; } elseif(248 <= $t && $t <= 251) { $tn = 5; $n += 5; $noc += 2; } elseif($t == 252 || $t == 253) { $tn = 6; $n += 6; $noc += 2; } else { $n++; } if ($noc >= $length) { break; } } if ($noc > $length) { $n -= $tn; } $wordscut = substr($string, 0, $n); } else { for($i = 0; $i < $length - 1; $i++) { if(ord($string[$i]) > 127) { $wordscut .= $string[$i].$string[$i + 1]; $i++; } else { $wordscut .= $string[$i]; } } } $string = $wordscut; } return trim($string); } // 示例 echo getstr("0一二三四五六七",1).'<br />'; // 0 echo getstr("0一二三四五六七",2).'<br />'; // 0 echo getstr("0一二三四五六七",3).'<br />'; // 0一 echo getstr("0一二三四五六七",4).'<br />'; // 0一 echo getstr("0一二三四五六七",5).'<br />'; // 0一二 echo getstr("0一a二b三四五六七",1).'<br />'; // 0 echo getstr("0一a二b三四五六七",2).'<br />'; // 0 echo getstr("0一a二b三四五六七",3).'<br />'; // 0一 echo getstr("0一a二b三四五六七",4).'<br />'; // 0一a echo getstr("0一a二b三四五六七",5).'<br />'; // 0一a此函數由UCHome 1.5中的getstr()函數修改而來。 以上就是如何解決php substr亂碼問題的方案,之前我們也分享了一系列關於php substr函數的文章,有需要的可以關注PHP中文網。 相關推薦:
#
以上是如何解決php substr亂碼問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!