首頁 >後端開發 >php教程 >如何解決php substr亂碼問題

如何解決php substr亂碼問題

小云云
小云云原創
2017-11-11 11:20:393667瀏覽

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).&#39;<br />&#39;;  // 0    
 echo getstr("0一二三四五六七",2).&#39;<br />&#39;;  // 0    
echo getstr("0一二三四五六七",3).&#39;<br />&#39;;  // 0一    
 echo getstr("0一二三四五六七",4).&#39;<br />&#39;;  // 0一    
 echo getstr("0一二三四五六七",5).&#39;<br />&#39;;  // 0一二    
 echo getstr("0一a二b三四五六七",1).&#39;<br />&#39;;    // 0    
  echo getstr("0一a二b三四五六七",2).&#39;<br />&#39;;    // 0    
 echo getstr("0一a二b三四五六七",3).&#39;<br />&#39;;    // 0一    
 echo getstr("0一a二b三四五六七",4).&#39;<br />&#39;;    // 0一a    
  echo getstr("0一a二b三四五六七",5).&#39;<br />&#39;;    // 0一a

此函數由UCHome 1.5中的getstr()函數修改而來。

以上就是如何解決php substr亂碼問題的方案,之前我們也分享了一系列關於php substr函數的文章,有需要的可以關注PHP中文網。

相關推薦:

關於PHP substr()函數的幾個程式

php substr()函數處理中文詳解

php substr()函數字串截取用法實例講解


#

以上是如何解決php substr亂碼問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn