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

對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.

在〈PHP 判斷 UTF-8 字串是 簡體 或 繁體中文〉中有 6 則留言

  1. 版主您好:這個簡繁判斷我用了很久一直都沒有問題,今天卻發現2個字串無法正常判別。
    $strings = ['徐小明', '王美玲'];
    foreach ($strings as $i => $s) {
    echo $s . "\n";
    var_dump(is_simplified($s));
    var_dump(is_traditional($s));
    }
    -----
    徐小明
    bool(false)
    bool(false)
    王美玲
    bool(false)
    bool(false)

    1. 嗯嗯,這兩個 Function 不是 100% 準確的。

      這兩個 Function 的運作原理是做 UTF-8 轉到 big5 / gb2312 轉換 的時候,會有文字的消失掉。才能計算。

      如果這些字 big5 / gb2312 都是同樣的話,就會造成判斷錯誤。

      所以這個 function 的用法是用來判斷「內容不含 繁體」、或 「內容不含 簡體」,然後再來做後續的判斷~

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料