Учитывая блок текста, который, как известно, является китайским и закодирован в 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';
}
}
@iconv
для 2 вызовов TRANSLIT
, чтобы подавить ошибки.
- person philfreo; 03.11.2010
'gb18030'
вместо 'gb2312'
. Или, если ваш ввод ориентирован на Windows, вы можете предпочесть 'cp936'
(и 'cp950'
вместо 'big5'
).
- person bobince; 04.11.2010
gb18030
, и все мои тестовые данные были распознаны. (Не могу быть уверенным в точности, хотя). Спасибо!
- person philfreo; 04.11.2010
Поскольку 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';