PHP Dil algılama (UTF-8)

3 Cevap php

Ne kod parçacıkları UTF-8 metin bir yığın dilini tespit için orada vardır? Ben temelde Çince ve Arapça olmak olur spam büyük miktarda filtre gerekir. Orada bunun için bir PECL uzantısı, ama PHP kodu sadece bunu yapmak istiyorum. Ben Ord () bir unicode sürümü ile bir Unicode dize döngü gerekir ve daha sonra farklı diller için bir dizi tablo çeşit oluşturmak sanırım.

3 Cevap

Boru aracılığıyla metin Google's language detection. AJAX ile bunu yapabilirsiniz. İşte documentation/developer's guide olduğunu. Örneğin:

<html>
  <head>
    <script type="text/javascript" src="http://www.google.com/jsapi"></script>
    <script type="text/javascript">

    google.load("language", "1");

    function initialize() {
      var text = document.getElementById("text").innerHTML;
      google.language.detect(text, function(result) {
        if (!result.error && result.language) {
          google.language.translate(text, result.language, "en",
                                    function(result) {
            var translated = document.getElementById("translation");
            if (result.translation) {
              translated.innerHTML = result.translation;
            }
          });
        }
      });
    }
    google.setOnLoadCallback(initialize);

    </script>
  </head>
  <body>
    <div id="text">你好,很高興見到你。</div>
    <div id="translation"></div>
  </body>
</html>

Bunu Unicode kod noktaları içine UTF-8 dizesi çevirmek ve "şüpheli aralıkları" için bakmak olabilir.

function utf8ToUnicode($utf8)
{
    if (!is_string($utf8)) {
    	return false;
    }
    $unicode  = array();
    $mbbytes  = array();
    $mblength = 1;
    $strlen   = strlen($utf8);

    for ($i = 0; $i < $strlen; $i++) {
    	$byte = ord($utf8{$i});
    	if ($byte < 128) {
    		$unicode[] = $byte;
    	} else {
    		if (count($mbbytes) == 0) {
    			$mblength = ($byte < 224) ? 2 : 3;
    		}
    		$mbbytes[] = $byte;
    		if (count($mbbytes) == $mblength) {
    			if ($mblength == 3) {
    				$unicode[] = ($mbbytes[0] & 15) * 4096 + ($mbbytes[1] & 63) * 64 + ($mbbytes[2] & 63);
    			} else {
    				$unicode[] = ($mbbytes[0] & 31) * 64 + ($mbbytes[1] & 63);
    			}
    			$mbbytes = array();
    			$mblength = 1;
    		}
    	}
    }
    return $unicode;
}

Basit yaklaşım, farklı dillerdeki ortak kelimeleri bir sözlük var ve o her dil karşı olsun kaç olumlu sonuç test muhtemelen. Ama oldukça pahalı (hesaplama-bilge) görev.