31

有没有办法确定一个字符串是英语还是阿拉伯语?

4

8 回答 8

50

这是我刚刚尝试过的一个简单逻辑:

  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;
  }

当且仅当在文本中找到阿拉伯 unicode 代码点时,它将文本声明为阿拉伯文。您可以增强此逻辑以更适合您的需求。

范围 0600 - 06E0 是阿拉伯字符和符号的代码点范围(参见Unicode 表

于 2013-02-27T08:50:33.193 回答
11

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;
}
于 2016-10-03T09:55:59.380 回答
7

覆盖所有阿拉伯字符和符号范围的小改动

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;
      }
于 2015-03-04T12:51:08.947 回答
3

您通常可以通过字符串本身的代码点来判断。阿拉伯语占据了 Unicode 代码空间中的某些块

可以肯定的是,如果这些块中存在相当大比例的字符(例如بلدي الحوامات مليء الثعابينة),则它是阿拉伯文本。

于 2013-02-27T08:30:48.557 回答
1

这个答案有些正确。但是当我们结合波斯语和英文字母时,它返回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;
}
于 2020-03-09T20:07:39.150 回答
0

您可以使用基于 N-gram 的文本分类(该短语用 google),但这不是一种防故​​障技术,它可能需要一个不太短的字符串。

您可能还认为只有 ASCII 字母的字符串不是阿拉伯语。

于 2013-02-27T08:30:31.893 回答
0

英文字符往往在这 4 个 Unicode 块中:

  • BASIC_LATIN
  • LATIN_1_SUPPLEMENT
  • LATIN_EXTENDED_A
  • 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;
    }
    
于 2018-12-05T18:32:23.910 回答
-1

尝试这个 :

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;
}
于 2014-09-24T12:33:07.347 回答