2010-11-02 11 views

cevap

3

Bunun işe yarayıp yaramayacağını bilmiyorum, ancak aynı dönüştürmeden elde edilen sonuçları // TRANSLIT ve // ​​IGNORE ile karşılaştırarak, karakter kümeleri arasında doğru bir çeviri olup olmadığını görmek için iconv kullanmayı denedim. İki sonuç eşleşirse, karakter dizisi dönüşümü, çevrilemeyen herhangi bir karakterle karşılaştıramadı, bu nedenle bir eşleşmeniz gerekir. big5 ve gb2312 yana

$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

İlginç, teşekkürler! Çok fazla metin "ne" olarak geri dönüyor olsa da, kesinlikle çalışıyor gibi görünüyor (örnek: "聲音 鳥 樹葉 話 説話 細 又 輕 蝴蝶 請 只有 和 得 聼 得到 蜜蜂"). Herhangi bir fikir? Ayrıca hataları bastırmak için 2 'TRANSLIT' çağrısı için' iconv' yapmak zorunda kaldım. – philfreo

+3

Temel GB-2312'de olmayan, ancak GB-18030'da bulunan bazı z-varyant karakterleriniz var. "Gb2312" yerine "gb18030" yi deneyin. Veya girişiniz Windows yönelimli ise, '' cp936 '' (ve '' big5 '' yerine '' cp950 '') tercih edebilirsiniz. – bobince

+0

"gb18030" ile değiştirdim ve tüm test verilerim tanınıyor. (Ancak doğruluktan emin olamaz). Teşekkürler! – philfreo

0

Unicode'da, kod, normal kullanım durumları oldukça çok başarısız olur translit ve ignore modları arasında tam eşlemesi itimat mevcut epeyce yaygın olarak kullanılan varyantları ihmal: başarısız olur 説話, , içiniçin kullanılan bir ortak varyant olmasına rağmen Geleneksel Çince olarak tanımlamak için.

Basit düzeltme bulanık bir şekilde yapmaktır:

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