PHP 在判斷簡體 / 繁體中文部份,以前是可以 Big5 / GB2312 / GBK 來判斷(可以使用 mb_detect_encoding()),但是 UTF-8 後,就有點麻煩了。
PHP 判斷 UTF-8 字串是 簡體 或 繁體中文
簡體和繁體的 UTF-8 字碼表是可以列的出來,不過會有一個字同時是簡體和繁體的情況,要判斷一個字串是簡體和繁體,這種判斷法有點複雜。
想到比較偷懶的方式,就是在把 UTF-8 轉換成 Big5 / CP950,再來比較看看字串長度(文字字串長度不同就代表不是繁體),雖然這個作法不是 100% 準確,但是應該夠用了。
PHP 有下述兩個 Function 是作編碼轉換的:
以往我都用 mb_convert_encoding() 來做轉換,但是在此轉換時,用這個轉 CP950 <-> UTF-8 這些在怎麼互轉,裡面的編碼都會幫我留存的很好,造成要去換算長度都是一
樣的,所以改用 iconv()。
註:iconv() 需要搭配 //IGNORE
mb_convert_encoding() 與 iconv() 的文字長度範例
<?php $strings = [ '微软软体', '微軟軟體', '今天天氣真好', ]; foreach ($strings as $i => $s) { echo $i . ' cp950: ' . mb_strlen(mb_convert_encoding($s, 'cp950', 'utf-8'), 'cp950') . "\n"; echo $i . ' cp950: ' . mb_strlen(iconv('UTF-8', 'cp950//IGNORE', $s), 'cp950') . "\n"; echo $i . ' cp950: ' . mb_strlen(mb_convert_encoding(mb_convert_encoding($s, 'cp950', 'utf-8'), 'UTF-8', 'cp950'), 'UTF-8') . "\n"; echo $i . ' utf-8: ' . mb_strlen($s, 'utf-8') . "\n"; } ?>
於上述測試,所以寫下述兩個 function 來判斷簡體與繁體
<?php // 判斷字串是否是簡體 function is_simplified($str) { $len = mb_strlen($str, 'utf-8'); return ($len != mb_strlen(iconv('UTF-8', 'cp950//IGNORE', $str), 'cp950')) ? true : false; } // 判斷字串是否是繁體 function is_traditional($str) { $len = mb_strlen($str, 'utf-8'); // gbk 包含 big5 內的字元,所以不能用 gbk return ($len != mb_strlen(iconv('UTF-8', 'gb2312//IGNORE', $str), 'gb2312')) ? true : false; } ?>
驗證範例
<?php $strings = [ '微软软体', '微軟軟體', '今天天氣真好', ]; foreach ($strings as $i => $s) { echo $s . "\n"; var_dump(is_simplified($s)); var_dump(is_traditional($s)); } ?>