X

PHP 判斷 UTF-8 字串是 簡體 或 繁體中文

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));
}
?>
Tsung: 對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.
Related Post