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

Java 如何确定字符串是英语还是阿拉伯语?,java,Java,有没有办法确定字符串是英语还是阿拉伯语?您可以使用基于N-gram的文本分类(谷歌搜索该短语),但这不是一种防故障技术,可能需要一个不太短的字符串 您可能还认为只有ASCII字母的字符串不是阿拉伯语。您通常可以通过字符串本身的代码点来判断。阿拉伯语占据Unicode代码空间 这是一个相当安全的赌注,如果这些块中存在相当大比例的字符(如 public static boolean isProbablyArabic(String s) { for (int i = 0; i < s

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

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


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

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


这是一个相当安全的赌注,如果这些块中存在相当大比例的字符(如

  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;
  }
public静态布尔值isProbablyArabic(字符串s){
对于(int i=0;i=0x0600&&c请尝试以下操作:

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;
}
内部静态bool包含两个字母(字符串文本)
{
foreach(text.ToCharArray()中的字符)
{

如果(字符>=0x600&&character=0x750&&character=0xfb50&&character=0xfe70&&character进行了细微更改,以覆盖所有阿拉伯字符和符号范围

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;
      }
private boolean isArabic(字符串文本){
String textWithoutSpace=text.trim().replaceAll(“,”);//忽略空白
对于(int i=0;i如果(c>=0x0600&&c=0xFE70&&cJava本身支持unicode的各种语言检查,那么也支持阿拉伯语。更简单、最小的方法是使用unicode块

public static boolean textContainsArabic(String text) {
    for (char charac : text.toCharArray()) {
        if (Character.UnicodeBlock.of(charac) == Character.UnicodeBlock.ARABIC) {
            return true;
        }
    }
    return false;
}

英文字符通常位于以下4个Unicode块中:

  • 基础拉丁语
  • 拉丁语补遗
  • 拉丁语扩展
  • 通用标点符号

    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;
    }
    
    • 有点正确。但当我们将波斯语和英语字母组合在一起时,它返回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;
      }
      
      public静态布尔值isProbablyArabic(字符串s){
      对于(int i=0;i如果从当今世界的角度来看,(!(c>=0x0600&&c),我想,“1234”是两个字吗?@Nishant,阿拉伯语是使用正则数还是Rumi?你的意思是它是包含英语还是阿拉伯语文本,还是以这种方式编码?第二种情况应该很简单,因为字符不在相同的Unicode范围内(请参阅:)。你不能以确定的方式来做这件事。所有信息都必须说明它是什么。这就是编码等的原因。但你可能会猜。你应该提供一个非常简短的Java演示来说明你的想法。否则,我认为这是最好的方法(英语与阿拉伯语)。它还需要大量的培训数据(更不用说训练时间了)。您可能还想检查其他阿拉伯语范围-请参阅我答案中的链接。此方法对于大型字符串非常低效,因为它会在每次迭代中计算字符串的长度。Character.codePointCount(s,0,s.length())应该首先分配给一个变量,这样它就不会在每次迭代中调用此函数。@jazib:实际上,更大的问题是对代码点的迭代,这是不正确的。只是解决了它。在我的情况下,您的代码是不可编译的,除非我用Character.UnicodeBlock.ARABIC替换Character.UnicodeBlock.ARABIC,请注意您的方法名是错误的isTextContainsHindi它应该是isTextContainsArabic@GuaravTyagi@Jeeva为了检查英语,英语字符通常在以下4个Unicode块中:基本拉丁语、拉丁语1补充、拉丁语扩展、通用标点符号