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)); } ?>
太棒了, 不知道有沒有Javascript的解決方案?
JavaScript 還是 node.js? JavaScript 是沒看過,node.js 我覺得應該是有解決方案~
你好!我想架設影視網站,但是採集的數據為UTF8簡體..如何讓在入庫之前轉為UTF8繁體呢
https://name.longwin.com.tw/twcn.php 可以做簡繁轉換~ 😛
版主您好:這個簡繁判斷我用了很久一直都沒有問題,今天卻發現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)
嗯嗯,這兩個 Function 不是 100% 準確的。
這兩個 Function 的運作原理是做 UTF-8 轉到 big5 / gb2312 轉換 的時候,會有文字的消失掉。才能計算。
如果這些字 big5 / gb2312 都是同樣的話,就會造成判斷錯誤。
所以這個 function 的用法是用來判斷「內容不含 繁體」、或 「內容不含 簡體」,然後再來做後續的判斷~