Wednesday, October 22, 2008

UTF8每個字的長度取法

UTF8每個字的長度取法剛在新聞群組看有人在討論utf8的每個單字要如何取得,雖然有很方便的Multibyte String Functions可以用,但是似乎還是很多人不會用?哈~這個不談~因為很多人用久了 PHP的函式,因為太方便了,漸漸的都會變呆了~只要一個函式,就處理掉了,至於怎樣作~都不知道了~於是~造就了不少只會CODE不會PROGRAM的打字員!所以~有必要還是提醒各位 TimClub的好兄弟,多思考各角度,多虛心接受各方的吐嘈,才能讓自己的專業更加專業,這樣~就不用跟著人家抱怨而拋棄理想去賣雞排或賣咖啡~下面這段程式碼,是由一個UTF8規格定義中,每個字的長度是由第一個字元的ASCII值來判斷整個在MAP陣列對應的長度,這樣就可以分別取得一整個UTF8的整格字串,拆成一個一個字!例如:我=>E6 99 91=>第一個字元是E6 (十進位為230)=>對應MAP就是3  :ˊ=>CB 8A =>第一個字元是CB(十進位為203)=>對應MAP就是2以此類推,找第一個字元然後就可以對應整個長度之後,就可以取得該字!
【程式碼】

<?php
// 這個陣列是跟MB_STRING裡面的libmbfl/filters/mbfilter_utf8.c借用的
$mblen_table_utf8 = array(
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 1, 1
);

$utf8_string = "注音符號的二聲:ˊ";

for ($i = 0; $i<strlen($utf8_string); ) {
// 取得第一個字的 ASCII 值
$index = ord($utf8_string[$i]);
// 取得對應的 UTF-8 的長度
$utf8len = $mblen_table_utf8[$index];
// 取得一個 UTF-8 的字
$word = substr($utf8_string, $i, $utf8len);
echo $word."=> 長度=> $utf8len <br>";
$i += $utf8len;
}

?>

ps.程式碼記得轉為utf-8

No comments: