Распознавание текста как упрощенного по сравнению с традиционным китайским языком
Учитывая блок текста, который, как известно, является китайским и закодирован в UTF-8, есть ли способ определить, является ли он упрощенным или традиционным?
2 ответа:
Я не знаю, будет ли это работать, но я бы попробовал использовать 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'; } }
Поскольку
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';