由於utf8編碼有固定格式,其可能有2~4個字節,我們可以將每一個字節拆開判斷
這個函示僅判斷每個中文字的第一個字節,應該夠了。

請參考 wikipedia 之 UTF8 說明 ,網址 http://zh.wikipedia.org/zh-tw/UTF8

//判斷字串是否為utf8
function  is_utf8($str)  {
    $i=0;
    $len  =  strlen($str);

    for($i=0;$i<$len;$i++)  {
        $sbit  =  ord(substr($str,$i,1));
        if($sbit  <  128)  {
            //本字節為英文字符,不與理會
        }elseif($sbit  >  191  &&  $sbit  <  224)  {
            //第一字節為落於192~223的utf8的中文字(表示該中文為由2個字節所組成utf8中文字),找下一個中文字
            $i++;
        }elseif($sbit  >  223  &&  $sbit  <  240)  {
            //第一字節為落於223~239的utf8的中文字(表示該中文為由3個字節所組成的utf8中文字),找下一個中文字
            $i+=2;
        }elseif($sbit  >  239  &&  $sbit  <  248)  {
            //第一字節為落於240~247的utf8的中文字(表示該中文為由4個字節所組成的utf8中文字),找下一個中文字
            $i+=3;
        }else{
            //第一字節為非的utf8的中文字
            return  0;
        }
    }
    //檢查完整個字串都沒問體,代表這個字串是utf8中文字
    return  1;
}

底下是各別中文字字節的範圍

Unicode                                      1st  Byte  2nd  Byte  3rd  Byte  4th  Byte
-------------------------------------------------------------------------------
U+0000..007F                              00..7F
U+0080..07FF                              C2..DF     80..BF
U+0800..0FFF                               E0           A0..BF              80..BF
U+1000..CFFF                               E1..EC    80..BF              80..BF
U+D000..D7FF                               ED          80..9F              80..BF
U+E000..FFFF                                EE..EF     80..BF              80..BF
U+10000..3FFFF                            F0           90..BF              80..BF              80..BF
U+40000..FFFFF                            F1..F3      80..BF              80..BF              80..BF
U+100000..10FFFF                        F4            80..8F              80..BF              80..BF

文章轉貼至 http://203.68.102.46/online_book/content.php?chapter_sn=172 


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 Frank 的頭像
    Frank

    經驗交流分享與備忘

    Frank 發表在 痞客邦 留言(0) 人氣()