如何确定字符串是英语还是阿拉伯语?

时间:2013-02-27 08:28:27

标签: java

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

8 个答案:

答案 0 :(得分:37)

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

  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 tables

答案 1 :(得分:9)

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

答案 2 :(得分:5)

包含所有阿拉伯字符和符号范围的微小更改

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

答案 3 :(得分:3)

您通常可以通过字符串本身中的代码点来判断。阿拉伯语占用Unicode代码空间中的certain blocks

这是一个相当安全的赌注,如果这些块中存在相当大比例的字符(例如بلدي الحوامات مليء الثعابينة),那就是阿拉伯语文本。

答案 4 :(得分:0)

您可以使用基于N-gram的文本分类(谷歌用于该短语)但它不是防错技术,并且可能需要一个不太短的字符串。

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

答案 5 :(得分: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;
    }
    

答案 6 :(得分:0)

This answer有点正确。但是,当我们将波斯语和英语字母组合在一起时,它会返回 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;
}

答案 7 :(得分:-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;
}