Распознавание текста как упрощенного и традиционного китайского

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


person philfreo    schedule 02.11.2010    source источник


Ответы (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';
   }
}
person Mark Baker    schedule 03.11.2010
comment
Интересно, спасибо! Кажется, это определенно работает, хотя много текста не возвращается, как ни то, ни другое (пример: 聲音 鳥 樹葉 話 説話 細 又 輕 蝴蝶 請 只有 和 得 聼得到 蜜蜂). Любые идеи? Мне также пришлось сделать @iconv для 2 вызовов TRANSLIT, чтобы подавить ошибки. - person philfreo; 03.11.2010
comment
У вас есть несколько символов z-варианта, которых нет в базовом GB-2312, но они есть в GB-18030. Попробуйте 'gb18030' вместо 'gb2312'. Или, если ваш ввод ориентирован на Windows, вы можете предпочесть 'cp936''cp950' вместо 'big5'). - person bobince; 04.11.2010
comment
Я заменил gb18030, и все мои тестовые данные были распознаны. (Не могу быть уверенным в точности, хотя). Спасибо! - person philfreo; 04.11.2010
comment
GB18030 — это формат преобразования Unicode, т. е. GB18030 будет соответствовать каждому отдельному символу в Unicode, традиционном, архаичном или упрощенном (включая, скажем, корейский и арабский языки). Цитируемый текст явно является традиционным китайским, но 聼 не включен в Big5, несмотря на то, что это иероглиф традиционного китайского языка. - person Henry; 20.01.2016

Поскольку 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';
person Henry    schedule 20.01.2016