我需要实现一种非常粗略的语言识别算法。在我的世界里,只有两种语言:英语和非英语。我有ArrayList,我需要确定每个String是否可能是英文或其他语言在某个范围内具有Unicode字符。所以我想要做的是使用某种类型的“在线”测试来检查每个字符串。如果通过测试,我说String不是英文,否则是英文。我想尝试两种类型的测试:
由于数组可能很长,我需要非常有效地实现它。在Java中最快的方法是什么?
THX
更新:我通过查看特定范围的Unicodes来检查非英语,而不是检查字符是否为ASCII,部分是为了处理下面提到的“恢复”问题。我想弄清楚的是Java是否提供了尽可能高效地实现TEST-ANY或TEST-ALL(或其他类似测试)的任何类/方法。换句话说,我试图避免重新发明轮子,特别是如果在我之前发明的轮子更好的话。
答案 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挑选了一个错误的替换测试。