2013-02-27 3 views
16

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

+3

С точки зрения сегодняшнего мира, «1234» - это как я? –

+0

@Nishant, на арабском языке используются обычные номера или Руми? – paxdiablo

+1

Вы имеете в виду, содержит ли он английский или арабский текст или кодируется ли он таким образом? Второй случай должен быть довольно простым, так как символы не находятся в одном диапазоне Unicode (см. Http://en.wikipedia.org/wiki/Arabic_alphabet). – Martin

ответ

26

Вот простая логика, я просто попытался:

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 tables)

+1

Вы также можете проверить все остальные арабские диапазоны - см. Ссылку в моем ответе. – paxdiablo

+1

Этот метод очень неэффективен для больших строк, поскольку он вычисляет длину строки на каждой итерации. Character.codePointCount (s, 0, s.length()) должен быть сначала назначен переменной, чтобы она не вызывала эту функцию на каждой итерации. – Jazib

+0

@jazib: Хороший момент, спасибо. Я исправил код соответствующим образом. –

0

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

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

+0

Он также нуждается в большом количестве данных для обучения (не говоря уже о времени обучения). – brimborium

3

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

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

+0

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

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

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

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

Ваш код не подлежит компиляции в моем случае, если я не заменю Character.UnicodeBlock.Ar с Character.UnicodeBlock.ARABIC, также любезно обратите внимание, что имя вашего метода неверно. IsTextContainsHindi должно быть isTextContainsArabic @Guarav Tyagi –

Смежные вопросы