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

31
有没有一种方法可以确定一个字符串是英语还是阿拉伯语?

3
就当今世界而言,“1234”是我的看法吗? - user2030471
@Nishant,阿拉伯语使用常规数字还是鲁米数字? - paxdiablo
2
你的意思是它包含英文或阿拉伯文本,还是编码方式是这样的?第二种情况应该很容易,因为这些字符不在同一Unicode范围内(参见:http://en.wikipedia.org/wiki/Arabic_alphabet)。 - Martin
1
你无法以确定的方式完成这件事。所有信息必须说明其内容,这就是为什么需要使用 content-type、编码等的原因。但你可以猜测。 - PeterMmm
10个回答

53

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

  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
您可能还想检查其他阿拉伯范围——请参见我的答案中的链接。 - paxdiablo
3
这种方法对于大字符串非常低效,因为它在每次迭代中都要计算字符串的长度。应该先将Character.codePointCount(s, 0, s.length())赋值给一个变量,这样它就不会在每次迭代中调用此函数。 - Jazib
@jazib:实际上更大的问题是对代码点的迭代,这是不正确的。我刚刚修复了它。 - Eyal Schneider

13

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

1
除非我将Character.UnicodeBlock.Ar替换为Character.UnicodeBlock.ARABIC,否则您的代码在我的情况下无法编译。另外请注意,您的方法名称有误,应该是isTextContainsArabic而不是isTextContainsHindi。@Guarav Tyagi - A.Alqadomi
@Jeeva 为了检查英语,英文字符通常位于这4个Unicode块中:BASIC_LATIN,LATIN_1_SUPPLEMENT,LATIN_EXTENDED_A,GENERAL_PUNCTUATION。 - Gaurav Tyagi

9
一个小改变,以覆盖所有阿拉伯字符和符号范围。
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

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

如果大部分字符存在于这些块中(例如بلدي الحوامات مليء الثعابينة),那么很可能是阿拉伯文本。


你应该提供一个非常简短的Java演示来展示你的想法。否则,在这种情况下,我认为这是最好的选择(英语 vs 阿拉伯语)。 - brimborium

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

0

这只是对现有答案进行 Kotlin 的适应。

fun String.textContainsArabic(): Boolean =
    any { Character.UnicodeBlock.of(it) == Character.UnicodeBlock.ARABIC }

0

我用我的代码尝试了这个,它运行良好。 使用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;
}

0

你可以使用基于N-gram的文本分类(谷歌搜索该短语),但这并不是一种万无一失的技术,可能需要一个不太短的字符串。

你也可以决定只有ASCII字母的字符串不是阿拉伯语。


它还需要大量的训练数据(更不用说训练时间了)。 - brimborium

0

英文字元通常位于这四个Unicode块中:

  • BASIC_LATIN(基本拉丁字母)
  • LATIN_1_SUPPLEMENT(拉丁语补充-1)
  • LATIN_EXTENDED_A(拉丁语扩展-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;
    }
    

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

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