如何解決php substr亂碼問題

來源:互聯網
上載者:User
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函數的一系列文章,有需要的可以關注topic.alibabacloud.com。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.