Сегодня я бы хотел рассказать о категориях Unicode-символов в C#. Наверняка все использовали такие функции как char.IsLower(c), char.IsDigit(c) и подобные. Это определённо лучший способ получить информацию о символе, но мы можем получить гораздо больше информации о Unicode символах, если воспользуемся функцией char.GetUnicodeCategory(c)…
Функция GetUnicodeCategory возвращает значение перечисления UnicodeCategory. Данное перечисление имеет порядка 30 значений, подробно о каждом можно прочитать в MSDN
Наиболее интересными мне показались следующие:
-
CurrencySymbol — символ денежной единицы;
- MathSymbol — математические символы, такие как «=» и «+»;
- OpenPunctuation — открывающий символ для одного из парных знаков, таких как квадратные и круглые скобки;
- ClosePunctuation — закрывающий символ, для одного из парных знаков;
- …
Использовать эти и остальные категории можно для различных анализов текста. Если необходимо проверять символ на определённое условие, удобно использовать расширения.
public static class CharExtensions
{
public static bool IsOpenPunctuation(this char c)
{
return char.GetUnicodeCategory(c) == UnicodeCategory.OpenPunctuation;
}
public static bool IsClosePunctuation(this char c)
{
return char.GetUnicodeCategory(c) == UnicodeCategory.ClosePunctuation;
}
public static bool IsMath(this char c)
{
return char.GetUnicodeCategory(c) == UnicodeCategory.MathSymbol;
}
public static bool IsCurrency(this char c)
{
return char.GetUnicodeCategory(c) == UnicodeCategory.CurrencySymbol;
}
}
Данное расширение позволяет проверить символ на то, что он является открывающим символом, закрывающим символом, математическим символом, символом денежной единицы.
Если же мы делаем анализ теста и нам необходимо подсчитать количество символом различных группы, то тогда лучше всего на прямую работать с UnicodeCategory. Напишем программу, делающую небольшой анализ текста.
var text = "=Пример текста для анализа (1)((2)$ €€ +";
var openPunctuation = 0;
var closePunctuation = 0;
var math = 0;
var currency = 0;
for (int i = 0; i < text.Length; i++)
{
switch (char.GetUnicodeCategory(text[i]))
{
case UnicodeCategory.OpenPunctuation:
openPunctuation++; break;
case UnicodeCategory.ClosePunctuation:
closePunctuation++; break;
case UnicodeCategory.MathSymbol:
math++; break;
case UnicodeCategory.CurrencySymbol:
currency++; break;
}
}
Console.WriteLine("Открывающих символов {0}", openPunctuation);
Console.WriteLine("Закрывающих символов {0}", closePunctuation);
if (openPunctuation != closePunctuation)
{
Console.WriteLine("\tНарушена расстановка скобок");
}
Console.WriteLine("Математических символов {0}", math);
Console.WriteLine("Денежных символов {0}", currency);
Результат:

Приятного программирования.