如何确定一个字符串是英语还是波斯语?

11

我在一个表单中有一个EditText,我希望当用户在EditText中输入文本时,我的程序可以检测到输入的语言是什么。

有没有一种方法可以确定字符串是英文还是波斯语?

我找到了这个阿拉伯语的代码

public static boolean isProbablyArabic(String s) {
for (int i = 0; i < Character.codePointCount(s, 0, s.length()); i++) {
    int c = s.codePointAt(i);
    if (c >= 0x0600 && c <=0x06E0)
        return true;
}
return false;
}

但我该如何将这段代码改成波斯语?


字符编码范围可能足够强大,以应对这个简单的二选一问题。对于更高级的方法,请查看一些语言识别库。 - tripleee
@tripleee 波斯字符代码范围是什么? - Saeed Hashemi
http://en.wikipedia.org/wiki/Arabic_script_in_Unicode - tripleee
@tripleee 但我使用波斯语或英语,阿拉伯语与波斯语有一些不同。 - Saeed Hashemi
如果您期望的波斯语输入不使用阿拉伯文字符,您需要通过提供更多细节来更新您的问题。 - tripleee
5个回答

6

2

你可以使用正则表达式来判断字符串是英语还是波斯语。

public static final Pattern VALID_NAME_PATTERN_REGEX = Pattern.compile("[a-zA-Z_0-9]+$");

public static boolean isEnglishWord(String string) {
    return VALID_NAME_PATTERN_REGEX.matcher(string).find();
}

这仅适用于文字和数字。如果有像“=”或“+”这样的字符,该函数将返回false。您可以通过编辑正则表达式来匹配所需内容以解决此问题。


1

如果不采用复杂的方法,很难确定用户输入的语言,因此你提供的方法示例被称为isProbablyArabic而不是isArabic。如果你的用户仅使用英语或波斯语写作,可以使用一个正则表达式来查看用户的文本是否包含西罗马字符("^[a-zA-Z]*$"),如果返回false,则可以假定他们输入的是波斯语,但也可能是使用不同字符集的任何其他语言。


1
当键盘弹出时,为什么不进行评估?这意味着您可以通过获取手机的语言来实现... 这里是方法 useLocale.getDefault().getDisplayLanguage(); 需要minSDK 11。

不过可能用户会复制粘贴文本! - Saeed Hashemi
并且程序的minSDK为8。 - Saeed Hashemi
如果您的应用程序在线...则尝试使用谷歌翻译API。 - Bhaskar
您可以根据以下标准unicode集URL更改那些Unicode点0x0600...。http://www.utf8-chartable.de/unicode-utf8-table.plhttp://www.tamasoft.co.jp/en/general-info/unicode.html - Bhaskar

0

使用字符范围并不是检测某些具有重叠范围的语言(例如阿拉伯语、波斯语和乌尔都语)的完美方法。但是,如果您坚持使用这种方式,我的建议是寻找特定于语言的特殊字符。例如,گ或پ在波斯语中存在,但在阿拉伯语中不存在。另一方面,ئ或ة在阿拉伯文本中可能比波斯语更常见。通过计算这些特定字符,您可以区分阿拉伯语、波斯语和乌尔都语。

虽然我从上述方法中获得了良好的结果,但使用n-gram来检测语言更受欢迎和可靠。有许多库通过这种方法执行语言检测任务。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接