天天看點

PHP截取中文字元串亂碼問題(UTF8編碼下)

    前幾天,去面試中遇到一個幫畢業就遇到的問題,PHP截取中文字元串亂碼問題。究其根本php的字元串截取函數是根據位元組來的,而漢字的編碼一需要的不單單一個位元組,那麼自然就會出現亂碼問題。

    現在常用的編碼格式是UTF8,GBK,GBK2312,BIG5。GBK是GBK2312的更新。現在我開發中遇到的基本都是UTF8,GBK常用在論壇BBS上。今天自己寫了下UTF8的,測試下還說的過去,畢竟從網上拷下來的是可以用,但是如果有時間最好還是自己寫一下,這樣隻有到自己手裡的才是自己的。

    今天寫了UTF8的中文字元截取,不單單是截取從零開始,可以指定位置開始,當然如果是中文那麼會中文下一個字元開始,結束是從指定的位置或者指定的漢字結束位置。

函數代碼:

function subUTF8str($str,$start=0,$length=80){ 

    $str_length = strlen($str);//傳入字元串的位元組長度 

    $end_length = $start + $length; //8 //預計結束位元組 

    $cut_length = 0; //截取的位元組長度 

    $cut_end = $cut_begin = false; //初始化截取狀态 

    if($start >= $str_length){ //如果字元串開始位置大于字元串總長度 那麼傳回空 

        return null; 

    } 

    if( ($start == 0) && ($length >= $str_length) ){ //如果起始位置是0 截取長度大于等于總長度 直接傳回 

        return $str; 

    for($i=0; $i <= $str_length; $i++){ 

        if( ($start <= $i) && ($cut_begin === false) ){//如果這一個判斷在第二個if後面則取下一個漢字為開頭 

            $cut_begin = $i; 

        } 

        if (ord($str[$i]) > 127){ //如果目前字元的ASCII 值大于127 則是認為是漢字 

            $i += 2; //UTF-8漢字是24位三個位元組 如果是漢字那麼增加兩位 

            $cut_begin?$cut_length += 3:null; 

        }else{ 

            $cut_begin?$cut_length += 1:null; 

        if( ($end_length <= $i) && ($cut_end === false) ){ 

            break; 

    return substr($str, $cut_begin , $cut_length ); 

整體測試代碼

header("Content-type:text/html;charset=UTF-8"); 

set_time_limit(0); 

$str = ''; 

for($i=0;$i<1000;$i++){ 

    $str .='這裡是截cefaACC截$%^&*截()_((截^&*^截*&%截%'; 

echo time().'<br/>'; 

    $begin = rand(1,100); 

    $length = rand(1,1000); 

    echo subUTF8str($str,$begin,$length)."\n"; 

下次有機會寫其他編碼格式的

    本文轉自kefirking 51CTO部落格,原文連結:,http://blog.51cto.com/phpzf/794660如需轉載請自行聯系原作者