Java:寻找检查String在特定范围内是否存在Unicode字符的最快方法

时间:2012-06-05 01:23:43

标签: java string unicode

我需要实现一种非常粗略的语言识别算法。在我的世界里,只有两种语言:英语和非英语。我有ArrayList,我需要确定每个String是否可能是英文或其他语言在某个范围内具有Unicode字符。所以我想要做的是使用某种类型的“在线”测试来检查每个字符串。如果通过测试,我说String不是英文,否则是英文。我想尝试两种类型的测试:

  1. TEST-ANY:如果字符串中的任何字符落在该范围内,则该字符串将通过测试
  2. TEST-ALL:如果字符串中的所有字符都在范围内,则字符串将通过测试
  3. 由于数组可能很长,我需要非常有效地实现它。在Java中最快的方法是什么?

    THX

    更新:我通过查看特定范围的Unicodes来检查非英语,而不是检查字符是否为ASCII,部分是为了处理下面提到的“恢复”问题。我想弄清楚的是Java是否提供了尽可能高效地实现TEST-ANY或TEST-ALL(或其他类似测试)的任何类/方法。换句话说,我试图避免重新发明轮子,特别是如果在我之前发明的轮子更好的话。

3 个答案:

答案 0 :(得分:4)

我真的不认为这个解决方案非常适合确定语言,但是如果你想查看一个字符串是否都是ascii,你可以这样做:

public static boolean isASCII(String s){
    boolean ret = true;
    for(int i = 0; i < s.length() ; i++) {
        if(s.charAt(i)>=128){
            ret = false;
            break;
        }
    }
    return ret;
}

那么如果你试试这个:

boolean r = isASCII("Hello");

r等于真。但如果你尝试:

boolean r = isASCII("Grüß dich");

然后r等于假。我没有测试过性能,但是这样做会相当快,因为​​它所做的就是将一个字符与数字128进行比较。

但正如@AlexanderPogrebnyak在上面的评论中提到的,如果你给它“简历”,这将返回false。请注意这一点。

更新

  

我通过查看特定范围的Unicodes而不是检查字符是否为ASCII来专门检查非英语

但ASCII Unicode中的范围(至少在UTF-8中)。 Unicode只是ASCII的扩展。什么代码@mP。我提供的是检查每个角色是否在一定范围内。我选择该范围为ASCII,这是任何小数字小于128的Unicode字符。您也可以选择任何其他范围。但我选择ASCII的原因是因为它是拉丁字母,阿拉伯数字和其他一些通常在“英语”字符串中的常见字符。

答案 1 :(得分:4)

以下是我最终实施TEST-ANY的方式:

// TEST-ANY
String str = "wordToTest";
int UrangeLow = 1234; // can get range from e.g. http://www.utf8-chartable.de/unicode-utf8-table.pl
int UrangeHigh = 2345;
for(int iLetter = 0; iLetter < str.length() ; iLetter++) {
   int cp = str.codePointAt(iLetter);
   if (cp >= UrangeLow && cp <= UrangeHigh) {
      // word is NOT English
      return;
   } 
}
// word is English
return;

答案 2 :(得分:2)

public static boolean isAscii( String s ){
    int length = s.length;
    for( int i = 0; i < length; i++){
       final char c = s.charAt( i );
       if( c > 'z' ){
          return false;
       }
    }
    return true;
}

@Hassan感谢你用小z挑选了一个错误的替换测试。