Распознавание текста как упрощенного и традиционного китайского - PullRequest
6 голосов
/ 03 ноября 2010

Учитывая блок текста, который известен как китайский и кодируется в UTF-8, есть ли способ определить, является ли он упрощенным или традиционным?

Ответы [ 2 ]

4 голосов
/ 03 ноября 2010

Я не знаю, сработает ли это, но я бы попробовал использовать 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';
   }
}
0 голосов
/ 20 января 2016

Поскольку в big5 и gb2312 опущено довольно много часто используемых вариантов, присутствующих в Юникоде, код, основанный на точном совпадении режимов 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';
...