将文本识别为简体中文还是繁体中文

6

如何判断一个已知为中文且采用 UTF-8 编码的文本是简体还是繁体?

2个回答

4
我不确定这个方法是否有效,但我建议使用iconv尝试将字符集正确地转换。可以使用//TRANSLIT和//IGNORE两种方式进行相同的转换,并比较结果。如果两个结果匹配,则字符集转换没有遇到任何无法转换的字符,因此应该是匹配的。
$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';
   }
}

有趣,感謝!看起來肯定有效,儘管很多文本返回“neither”(例如:“聲音 鳥 樹葉 話 説話 細 又 輕 蝴蝶 請 只有 和 得 聼得到 蜜蜂”)。 有什麼想法?我還必須對2個TRANSLIT調用進行@iconv以抑制錯誤。 - philfreo
4
您的内容中有一些基本 GB-2312 字符集中没有的 z-variant 字符,但这些字符在 GB-18030 中出现。请尝试使用 'gb18030' 而不是 'gb2312'。如果您的输入是面向 Windows 系统的,则可能更喜欢使用 'cp936'(而不是 'big5' 则使用 'cp950')。 - bobince
我使用了 gb18030,所有的测试数据都被识别了。(虽然准确性还不能确定)。谢谢! - philfreo
GB18030是一种Unicode转换格式,即GB18030将匹配Unicode中的每个单个字符,包括繁体、古代或简化(以及例如韩语和阿拉伯语)。引用的文本显然是繁体中文,但“聼”并未包含在Big5中,尽管它是一个繁体中文字符。 - Henry

2

由于big5gb2312省略了许多Unicode中常用的变体,因此在translitignore模式之间依赖精确匹配的代码将在很多正常用例中失败:它将无法识别説話为繁体中文,尽管是香港对的一种常见变体,后者在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';

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接