有没有一种方法可以确定一个字符串是英语还是阿拉伯语?
这是我刚刚尝试的一个简单逻辑:
public static boolean isProbablyArabic(String s) {
for (int i = 0; i < s.length();) {
int c = s.codePointAt(i);
if (c >= 0x0600 && c <= 0x06E0)
return true;
i += Character.charCount(c);
}
return false;
}
Java内置了对Unicode的多国语言支持,包括阿拉伯语。使用UnicodeBlock是实现相同功能的更简单、更小巧的方法。
public static boolean textContainsArabic(String text) {
for (char charac : text.toCharArray()) {
if (Character.UnicodeBlock.of(charac) == Character.UnicodeBlock.ARABIC) {
return true;
}
}
return false;
}
private boolean isArabic(String text){
String textWithoutSpace = text.trim().replaceAll(" ",""); //to ignore whitepace
for (int i = 0; i < textWithoutSpace.length();) {
int c = textWithoutSpace.codePointAt(i);
//range of arabic chars/symbols is from 0x0600 to 0x06ff
//the arabic letter 'لا' is special case having the range from 0xFE70 to 0xFEFF
if (c >= 0x0600 && c <=0x06FF || (c >= 0xFE70 && c<=0xFEFF))
i += Character.charCount(c);
else
return false;
}
return true;
}
通常,您可以通过字符串本身中的代码点来判断。阿拉伯语占据Unicode代码空间中的某些块。
如果大部分字符存在于这些块中(例如بلدي الحوامات مليء الثعابينة
),那么很可能是阿拉伯文本。
这个答案有一定的正确性。但是当我们结合波斯语和英语字母时,它返回TRUE!这是不正确的。 这里我修改了相同的方法,使其能够正常工作。
public static boolean isProbablyArabic(String s) {
for (int i = 0; i < s.length();) {
int c = s.codePointAt(i);
if (!(c >= 0x0600 && c <= 0x06E0))
return false;
i += Character.charCount(c);
}
return true;
}
这只是对现有答案进行 Kotlin 的适应。
fun String.textContainsArabic(): Boolean =
any { Character.UnicodeBlock.of(it) == Character.UnicodeBlock.ARABIC }
我用我的代码尝试了这个,它运行良好。 使用codePointAt方法,该方法返回字符串中指定索引处字符的Unicode值。
public static boolean isItArabic(String someText)
{
for(int i = 0; i<someText.length(); i++)
{
int point = someText.codePointAt(i);
if(!(point >= 1536 && point <= 1791)) {
return false;
}
}
return true;
}
你可以使用基于N-gram的文本分类(谷歌搜索该短语),但这并不是一种万无一失的技术,可能需要一个不太短的字符串。
你也可以决定只有ASCII字母的字符串不是阿拉伯语。
英文字元通常位于这四个Unicode块中:
GENERAL_PUNCTUATION(通用标点符号)
public static boolean isEnglish(String text) {
boolean onlyEnglish = false;
for (char character : text.toCharArray()) {
if (Character.UnicodeBlock.of(character) == Character.UnicodeBlock.BASIC_LATIN
|| Character.UnicodeBlock.of(character) == Character.UnicodeBlock.LATIN_1_SUPPLEMENT
|| Character.UnicodeBlock.of(character) == Character.UnicodeBlock.LATIN_EXTENDED_A
|| Character.UnicodeBlock.of(character) == Character.UnicodeBlock.GENERAL_PUNCTUATION) {
onlyEnglish = true;
} else {
onlyEnglish = false;
}
}
return onlyEnglish;
}
试试这个:
internal static bool ContainsArabicLetters(string text)
{
foreach (char character in text.ToCharArray())
{
if (character >= 0x600 && character <= 0x6ff)
return true;
if (character >= 0x750 && character <= 0x77f)
return true;
if (character >= 0xfb50 && character <= 0xfc3f)
return true;
if (character >= 0xfe70 && character <= 0xfefc)
return true;
}
return false;
}