Как определить строку на английском или арабском?

Есть ли способ определить строку на английском или арабском?

Ответы

Ответ 1

Вот простая логика, которую я только что пробовал:

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

Он объявляет текст как арабский, если и только если в тексте найдена арабская кодовая точка юникода. Вы можете улучшить эту логику, чтобы быть более подходящей для ваших нужд.

Диапазон 0600 - 06E0 - это диапазон кодовых точек арабских символов и символов (см. Таблицы Unicode)

Ответ 2

Java сама по себе поддерживает различные проверки языка по юникоду, поддерживается арабский язык. Гораздо проще и наименьший способ сделать то же самое - UnicodeBlock

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

Ответ 3

Небольшое изменение, чтобы охватить все арабские символы и диапазон символов

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

Ответ 4

Обычно вы можете указывать кодовые точки внутри самой строки. Арабский занимает определенные блоки в кодовом пространстве Unicode.

Это довольно безопасная ставка, что если значительная часть символов существует в этих блоках (например, بلدي الحوامات مليء الثعابينة), это арабский текст.

Ответ 5

Вы можете использовать категоризацию текста на основе N-грамм (google для этой фразы), но она не является отказоустойчивой техникой и может потребовать не слишком короткую строку.

Вы также можете решить, что строка с буквами ASCII не является арабским.

Ответ 6

Английские символы, как правило, находятся в этих 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;
        }
     }
    
      return onlyEnglish;
    }
    

Ответ 7

Попробуйте следующее:

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