【问题标题】:How to check if the word is Japanese or English using PHP如何使用PHP检查单词是日语还是英语
【发布时间】:2011-02-20 20:46:52
【问题描述】:

我想在这个函数中对英文单词和日文单词有不同的处理

function process_word($word) {
   if($word is english) {
     /////////
   }else if($word is japanese) {
      ////////
   }
}

谢谢

【问题讨论】:

  • 也许它不必是语言......只是为了区分双字节字符

标签: php unicode multibyte


【解决方案1】:

英文文本通常只包含 ASCII 字符(或者更好的说法是 ASCII 范围内的字符)。

【讨论】:

  • 虽然很容易将大多数单词识别为英语或日语,但有些字符同时属于这两种字符集。例如,仅包含数字的字符串应该对英语和日语都返回 true。
【解决方案2】:

您可以尝试具有检测功能的 Google 翻译 API: http://code.google.com/apis/language/translate/v2/using_rest.html#detect-language

【讨论】:

    【解决方案3】:

    您可以尝试转换字符集并检查是否成功。

    看看iconv:http://www.php.net/manual/en/function.iconv.php

    如果您可以将字符串转换为 ISO-8859-1,则可能是英文,如果您可以转换为 iso-2022-jp,则可能是日文(我可能对确切的字符集有误,您应该在谷歌上搜索) .

    【讨论】:

      【解决方案4】:

      试试mb_detect_encoding函数,如果编码是EUC-JP或者UTF-8 / UTF-16可以是日文,否则是英文。 如果你能确保每种语言的编码方式更好,因为 UTF 编码可以用于多种语言

      【讨论】:

        【解决方案5】:

        不需要mb_string 扩展的快速解决方案:

        if (strlen($str) != strlen(utf8_decode($str))) {
            // $str uses multi-byte chars (isn't English)
        }
        
        else {
            // $str is ASCII (probably English)
        }
        

        或者修改solution provided by @Alexander Konstantinov

        function isKanji($str) {
            return preg_match('/[\x{4E00}-\x{9FBF}]/u', $str) > 0;
        }
        
        function isHiragana($str) {
            return preg_match('/[\x{3040}-\x{309F}]/u', $str) > 0;
        }
        
        function isKatakana($str) {
            return preg_match('/[\x{30A0}-\x{30FF}]/u', $str) > 0;
        }
        
        function isJapanese($str) {
            return isKanji($str) || isHiragana($str) || isKatakana($str);
        }
        

        【讨论】:

        • 这会忽略使用变音符号的英语单词。这些不经常使用,但是在做出选择时应该知道这是一个权衡:)
        • @Thomas.Winsnes:你的意思是HaiWaKaArigatou 等等,对吧?
        • 不,我的意思是英文单词,例如:naïve、cafe、ressumé、soufflé 等。
        • 我总是用 diæresis 写 naïve,用 æ 写 diæresis。
        • @AlixAxel 您可以检查上面 isHiragana() 和 isKatakana() 函数中给出的假名 Unicode 范围。任何包含其中任何一个的文本几乎肯定是日语,并且几乎所有不是极短的日语文本都会在这些范围内至少有几个字符。上面的 isJapanese() 应该写成 isHiragana($str) || isKatakana($str),因为 isKanji() 对于中文或(某些)韩文文本也会返回 true。
        【解决方案6】:

        这个函数检查一个单词是否至少包含一个日文字母(我在Wikipedia找到日文字母的unicode范围)。

        function isJapanese($word) {
            return preg_match('/[\x{4E00}-\x{9FBF}\x{3040}-\x{309F}\x{30A0}-\x{30FF}]/u', $word);
        }
        

        【讨论】:

        • 根据上面的评论,4E00-9FBF 中的字符不限于在日文中使用,所以这不是一个可靠的测试。 unicode.org/faq/han_cjk.html#4
        • 感谢 Alexander 提供的好代码。但是,\x 有什么作用?
        • @TrevorW,类似 \x{4E00} 的序列用于通过其十六进制代码指定 UTF-8 字符。有关详细信息,请参阅 PHP 手册:php.net/manual/en/regexp.reference.escape.php
        猜你喜欢
        • 2017-12-11
        • 2020-01-25
        • 1970-01-01
        • 2016-11-19
        • 2014-04-04
        • 1970-01-01
        • 1970-01-01
        • 2015-05-19
        • 2012-04-19
        相关资源
        最近更新 更多