2010-11-02 9 views

risposta

3

Non so se funzionerà, ma proverei ad usare iconv per vedere se si tradurrà correttamente tra i set di caratteri, confrontando i risultati della stessa conversione con // TRANSLIT e // IGNORE. Se i due risultati corrispondono, la conversione del set di caratteri non ha incontrato caratteri che non riescono a tradurre, quindi dovresti avere una corrispondenza.

$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

interessante, grazie! Sembra che funzioni sicuramente, anche se molti testi tornano come "nessuno dei due" (esempio: "聲音 鳥 樹葉 話 説話 細 又 輕 蝴蝶 請 只有 得 聼))"). Qualche idea? Dovevo anche fare '@ iconv' per le 2 chiamate 'TRANSLIT' per sopprimere gli errori. – philfreo

+3

Ci sono alcuni caratteri z-varianti che non si trovano nel GB-2312 di base, ma sono in GB-18030. Prova ''gb18030'' anziché'' gb2312''. O se il tuo input è orientato a Windows potresti preferire "cp936" (e "cp950" invece di "big5"). – bobince

+0

Ho effettuato lo scambio in 'gb18030' e tutti i miei dati di test sono stati riconosciuti. (Non posso essere sicuro della precisione però). Grazie! – philfreo

0

Dal big5 e gb2312 omettere un bel paio di varianti di uso comune che sono presenti in Unicode, il codice si affidano a corrispondenza esatta tra le modalità translit e ignore fallirebbe in un bel po 'di normali casi di utilizzo: fallirebbe per identificare 説話 come cinese tradizionale nonostante essere una variante comune a Hong Kong per che viene utilizzato in big5.

una semplice correzione è di farlo in un modo sfocata:

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