代码之家  ›  专栏  ›  技术社区  ›  deadprogrammer

PHP语言检测(UTF-8)

  •  3
  • deadprogrammer  · 技术社区  · 16 年前

    有什么代码片段可以用来检测UTF-8文本块的语言?我基本上需要过滤大量碰巧是中文和阿拉伯语的垃圾邮件。有一个PECL扩展,但是我想用PHP代码来实现。我想我需要用ord()的Unicode版本遍历Unicode字符串,然后为不同的语言创建某种范围表。

    4 回复  |  直到 16 年前
        1
  •  4
  •   cletus    16 年前

    用管道把你的文字通读一遍 Google's language detection 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>
    
        2
  •  2
  •   Gumbo    16 年前

    您可以将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;
    }
    
        3
  •  0
  •   troelskn    16 年前

        4
  •  0
  •   Community CDub    8 年前

    阿拉伯字符 主要是在 0600–06FF . Unicode对阿拉伯语有一些补充。例如 code range 0750–077F code range 08A0–08FF 多写一些非洲语言,欧洲和中亚的字母 语言,巴基斯坦古兰经标记等。另外两个Unicode代码范围是阿拉伯语, FB50–FDFF FE70–FEFF 如果你已经覆盖了060006FF,可能就不那么重要了。

    字符 中国人 (以及日语和朝鲜语)注册在不同的Unicode范围内(有几个例外)。最重要的是 4E00–9FD5 . 假设你不需要担心日语,这就足够了 ,但如果要检查扩展名,请检查Unicode联盟的 list of code charts

    how to detect Unicode ranges in PHP .