解決中文字串的斷字問題?

//--STR: 原中文字串
//--N: 想要取得的長度, 以 byte 為單位, 中文字以 2byte 計
//--CS: 字原編碼
//回傳: 最多 N 字, 若最後一字為斷字的話, 回傳 N-1
    function  xf_getChstr($STR, $N=10, $CS='big5')  {
        $m=strlen($STR);
        if ($m <= $N)   return $STR;
        switch ($CS) {
            case 'big5':
                $sn=0;
                for ($i=0; $i<=$m; $i++) {
                    $sb=ord(substr($STR, $i, 1));
                    if ($sb >= 161 &&  $sb <= 249)  {   //--中文首碼
                        $sn+=2; $i+=1;
                        if ($sn>$N)     return substr($STR, 0, $sn-2);
                    } else {            //--其他ASCII字元
                        $sn+=1;
                    }
                    if ($sn>=$N)        return substr($STR, 0, $sn);
                }       //--for
                break;
            default:    //--utf8
                $k=0; $sn=0;
                for ($i=0; $i<=$m; $i++) {
                    $sb=ord(substr($STR, $i, 1));
                    if ($sb > 191 &&  $sb < 224)  {             //--2byte
                        $k+=2; $sn+=2; $i+=1;
                        if ($k>$N)      return substr($STR, 0, $sn-2);
                    } elseif ($sb > 223 &&  $sb < 240)  {       //--3byte
                        $k+=2; $sn+=3; $i+=2;
                        if ($k>$N)      return substr($STR, 0, $sn-3);
                    } elseif ($sb > 239 &&  $sb < 248)  {       //--4byte
                        $k+=2; $sn+=4; $i+=3;
                        if ($k>$N)      return substr($STR, 0, $sn-4);
                    } else {            //--其他ASCII字元
                        $k+=1; $sn+=1;
                    }
                    if ($k>=$N) return substr($STR, 0, $sn);
                }       //--for
        }       //--switch
        return '';
    }   //--xf_getChstr

請各位參考指教, 若有錯誤, 歡迎更正!
設計參考: http://203.68.102.46/online_book/content.php?chapter_sn=172

原始討論: http://twpug.net/x/modules/newbb/viewtopic.php?topic_id=1361
Sign In or Register to comment.