PHP语言检测(UTF-8)

时间:2009-02-04 18:10:11

标签: php internationalization

有哪些代码片段用于检测一大块UTF-8文本的语言?我基本上需要过滤大量的中文和阿拉伯文垃圾邮件。有一个PECL扩展,但我想纯粹在PHP代码中这样做。我想我需要使用unicode版本的ord()循环一个Unicode字符串,然后为不同的语言创建某种范围表。

4 个答案:

答案 0 :(得分:4)

通过Google's language detection管道您的文字。你可以通过AJAX来做到这一点。这是documentation/developer's guide。例如:

<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>

答案 1 :(得分:2)

您可以将UTF-8字符串转换为其Unicode代码点,并查找“可疑范围”。

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;
}

答案 2 :(得分:0)

最简单的方法可能是使用不同语言的常用单词词典,然后测试每种语言的正面匹配数量。然而,这是一项相当昂贵的(计算方面的)任务。

答案 3 :(得分:0)

阿拉伯字符主要位于 Unicode范围 0600–06FF中。 Unicode对阿拉伯语有一些补充等。例如,code range 0750–077F主要包含主要用于某些非洲语言的阿拉伯字符。 code range 08A0–08FF涵盖了非洲语言,欧洲和中亚的更多信件 语言,巴基斯坦古兰经标记等。如果您已经涵盖0600-06FF,阿拉伯语FB50–FDFFFE70–FEFF的另外两个Unicode代码范围可能不太重要。

中文(以及日语和韩语)的字符在不同的Unicode范围内注册(具有多个exntsions)。最重要的是4E00–9FD5。假设您不必担心日语,这对于脚本检测就足够了,但是如果您想检查扩展名,请查看Unicode联盟list of code charts

因此,如果您需要仅过滤阿拉伯文和中文脚本,并且不想使用troelskn建议的方法(即使用您要识别的语言的常用字词列表 - 这对于大量语言来说不能很好地扩展),检测输入中字符的代码范围应该足够了。 StackOverflow已经解决了之前关于how to detect Unicode ranges in PHP的问题。