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