2010-11-02 9 views

Respuesta

3

No sé si esto funcionará, pero trataría de usar iconv para ver si se traducirá correctamente entre los conjuntos de caracteres, comparando los resultados de la misma conversión con // TRANSLIT y // IGNORE. Si los dos resultados coinciden, entonces la conversión del juego de caracteres no ha encontrado ningún personaje que no se pueda traducir, por lo que debe tener una coincidencia.

$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

Interesante, gracias! Parece que definitivamente está funcionando, aunque una gran cantidad de texto está regresando como "ninguno" (ejemplo: "聲音 鳥"))))))))))) "). ¿Algunas ideas? También tuve que hacer '@ iconv' para las 2 llamadas' TRANSLIT' para suprimir errores. – philfreo

+3

Tiene algunos caracteres z-variantes que no están en GB-2312 básico, pero están en GB-18030. Pruebe ''gb18030'' en lugar de''gb2312''. O si su entrada está orientada a Windows, puede preferir '' cp936'' (y ''cp950'' en lugar de' 'big5''). – bobince

+0

Cambié en 'gb18030' y todos mis datos de prueba fueron reconocidos. (Aunque no estoy seguro de la precisión). ¡Gracias! – philfreo

0

Desde big5 y gb2312 omitir bastantes variantes de uso común que están presentes en Unicode, el código se basan en coincidencia exacta entre los modos translit y ignore fallaría en mucho de los casos de uso normales: que fracasaría para identificar 説話 como chino tradicional a pesar de siendo una variante común en Hong Kong para que se usa en big5.

Una solución sencilla es hacerlo de una manera difusa:

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