如何判断一个已知为中文且采用 UTF-8 编码的文本是简体还是繁体?
$test1 = iconv("UTF-8", "big5//TRANSLIT", $text);
$test2 = iconv("UTF-8", "big5//IGNORE", $text);
if ($test1 == $test2) {
echo 'traditional';
} else {
$test3 = iconv("UTF-8", "gb2312//TRANSLIT", $text);
$test4 = iconv("UTF-8", "gb2312//IGNORE", $text);
if ($test3 == $test4) {
echo 'simplified';
} else {
echo 'Failed to match either traditional or simplified';
}
}
由于big5
和gb2312
省略了许多Unicode中常用的变体,因此在translit
和ignore
模式之间依赖精确匹配的代码将在很多正常用例中失败:它将无法识别説話
为繁体中文,尽管説
是香港对說
的一种常见变体,后者在big5
中使用。
一个简单的解决方法是以模糊方式进行:
$test1 = iconv("UTF-8", "big5//IGNORE", $text);
$test2 = iconv("UTF-8", "gb2312//IGNORE", $text);
$len1 = mb_strlen($test1);
$len2 = mb_strlen($test2);
$len0 = mb_strlen($text) * 0.8; // threshold
if ($len1 > $len2 && $len1 > $len0) {
return 'Likely Traditional';
}
if ($len2 > $len1 && $len2 > $len0) {
return 'Likely Simplified';
}
return 'Could not identify';
'gb18030'
而不是'gb2312'
。如果您的输入是面向 Windows 系统的,则可能更喜欢使用'cp936'
(而不是'big5'
则使用'cp950'
)。 - bobincegb18030
,所有的测试数据都被识别了。(虽然准确性还不能确定)。谢谢! - philfreo