2016-01-18 3 views
1

У меня есть требование, у меня есть текстовое поле, которое я извлекаю из базы данных. Это может быть на арабском или английском. Я хочу дифференцировать его динамически и соответствующим образом изменить выравнивание. т.е. если текст на арабском языке, он должен быть справа налево слева направо.Как отличить текст и изменить соответствие соответственно

+1

Если текст содержит RTL знак, то Windows, делает это для вас. В противном случае вы можете просто проверить наличие символов (не забывайте, что System.Char представляет собой блок кода, а не кодовую точку) в [Блок кода арабского юникода] (https://en.wikipedia.org/wiki/Arabic_ (Unicode_block)) –

+0

Возможно, вы можете добавить флаг столбца в DB для RTL-текста. – i486

+0

Это текст не содержит метки RTL, а затем Windows * still * делает это за вас. Тем не менее, становится сложно, если текст смешивается, скажем, с арабскими глифами и с западной пунктуацией или цифрами. Это действительно лучше всего решается в программе, которая добавляет содержимое базы данных, поскольку она является тем, кто (должен) знать фактическое значение текста. –

ответ

0

Если текст содержит RTL mark, тогда Windows сделает это за вас.

В противном случае вы можете просто проверить символы (не забудьте System.Char представляет собой кодовую единицу, а не кодовую точку, но в данном случае это не проблема) в Unicode Arabic Code block:

public bool IsArabic(string text) 
{ 
    return Regex.IsMatch(text, "[\u06000-\u06FF]") 
} 
0

Вы можете сказали что текст арабский, если количество арабских символов больше, чем количество английских символов.

Вы можете определить его с помощью character classes in regular expression

public bool IsArabic(this string input) 
    { 
     var isArabic = Regex.Matches(input, "\\p{IsArabic}"); 
     var isLatin = Regex.Matches(input, "\\p{IsBasicLatin}"); 

     if (isArabic == null) 
      return false; 

     if (isLatin == null) 
      return true; //suggest that there is no another character types 

     if (isArabic.Count > isLatin.Count) 
      return true; 

     return false; 
    } 
+0

Хороший улов для названных классов (гораздо более читаемый, чем жесткий диапазон), но подсчет символов действительно чрезмерен и произволен. IMO, если есть ОДИН арабский символ (или другой RTL-алфавит), то это арабский, и он должен быть RTL. BTW IsBasicLatin (от \ u0000 до \ u007f) включает также множество общих _symbols_ и _numbers_ (часто используется также в арабском тексте вместо цифр арабского-индикатора). –

+0

Спасибо, это сработало – Jobin

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

  • Нет связанных вопросов^_^