2010-11-02 29 views

Répondre

3

Je ne sais pas si cela fonctionnera, mais j'essaierais d'utiliser iconv pour voir s'il se traduira correctement entre les jeux de caractères, en comparant les résultats de la même conversion avec // TRANSLIT et // IGNORE. Si les deux résultats correspondent, la conversion du jeu de caractères n'a pas rencontré de caractères qui ne peuvent pas être traduits. Vous devez donc faire correspondre les caractères.

$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

Intéressant, merci! Il semble définitivement fonctionner, bien que beaucoup de texte revienne comme "ni" (exemple: "聲音 鳥 樹葉 細 又 又 輕 只有 和 和 蜜蜂 蜜蜂 蜜蜂 蜜蜂 蜜蜂)"). Des idées? J'ai aussi dû faire '@ iconv' pour les 2 appels' TRANSLIT' pour supprimer les erreurs. – philfreo

+3

Vous avez des caractères z-variant qui ne sont pas en GB-2312 de base, mais ils sont en GB-18030. Essayez "gb18030" au lieu de "gb2312". Ou si votre saisie est orientée Windows, vous pouvez préférer '' cp936'' (et '' cp950'' au lieu de '' big5''). – bobince

+0

J'ai permuté 'gb18030' et toutes mes données de test ont été reconnues. (Je ne peux pas être sûr de l'exactitude cependant). Merci! – philfreo

0

Depuis big5 et gb2312 omettent un bon nombre de variantes couramment utilisées qui sont présentes dans Unicode, le code repose sur correspondance exacte entre les modes translit et ignore échouerait dans un assez grand nombre de cas d'utilisation normale: il échouerait pour identifier 説話 comme chinois traditionnel malgré étant une variante commune à Hong Kong pour qui est utilisé dans big5.

Une solution simple est de le faire de manière floue:

$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';