У меня есть требование, у меня есть текстовое поле, которое я извлекаю из базы данных. Это может быть на арабском или английском. Я хочу дифференцировать его динамически и соответствующим образом изменить выравнивание. т.е. если текст на арабском языке, он должен быть справа налево слева направо.Как отличить текст и изменить соответствие соответственно
ответ
Если текст содержит RTL mark, тогда Windows сделает это за вас.
В противном случае вы можете просто проверить символы (не забудьте System.Char
представляет собой кодовую единицу, а не кодовую точку, но в данном случае это не проблема) в Unicode Arabic Code block:
public bool IsArabic(string text)
{
return Regex.IsMatch(text, "[\u06000-\u06FF]")
}
Вы можете сказали что текст арабский, если количество арабских символов больше, чем количество английских символов.
Вы можете определить его с помощью 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;
}
Хороший улов для названных классов (гораздо более читаемый, чем жесткий диапазон), но подсчет символов действительно чрезмерен и произволен. IMO, если есть ОДИН арабский символ (или другой RTL-алфавит), то это арабский, и он должен быть RTL. BTW IsBasicLatin (от \ u0000 до \ u007f) включает также множество общих _symbols_ и _numbers_ (часто используется также в арабском тексте вместо цифр арабского-индикатора). –
Спасибо, это сработало – Jobin
Если текст содержит RTL знак, то Windows, делает это для вас. В противном случае вы можете просто проверить наличие символов (не забывайте, что System.Char представляет собой блок кода, а не кодовую точку) в [Блок кода арабского юникода] (https://en.wikipedia.org/wiki/Arabic_ (Unicode_block)) –
Возможно, вы можете добавить флаг столбца в DB для RTL-текста. – i486
Это текст не содержит метки RTL, а затем Windows * still * делает это за вас. Тем не менее, становится сложно, если текст смешивается, скажем, с арабскими глифами и с западной пунктуацией или цифрами. Это действительно лучше всего решается в программе, которая добавляет содержимое базы данных, поскольку она является тем, кто (должен) знать фактическое значение текста. –