Лекция
Строки языка С# и алгоритмы обработки текстов
Оглавление |
|
|
1 |
Тип данных char и символьные константы в UNICODE кодировке |
...............................................3 |
2 |
Массивы типа char и строки языка С#.............................................................................................. |
7 |
3 |
Обработка естественноязыковых текстов....................................................................................... |
12 |
4 |
Массивы строк в языке С#............................................................................................................... |
16 |
2
Строки в С#
1 Тип данных char и символьные константы в UNICODE кодировке
Как мы знаем, для представления одиночных символов естественных языков в языке С предназначен тип данных char (см. разд. 4.1 из книги [1]). В языке С# тоже есть тип char и применяется он с той же целью. Только тип char в языке С# кодирует символы в так называемой кодировке UNICODE (2 байта на один символ, вместо 1 байта по стандартным для языка С кодировкам ASCII/ANSI). Это сразу и радикально решает все проблемы с национальными языками, отличными от английского (и от западноевропейских языков). Нас в первую очередь интересует русский язык. Так вот, кодировка UNICODE позволяет нам программно работать с русским языком без проблем, и поэтому в данной главе мы для подчеркивания этого факта (и для привыкания к нему) будем использовать в качестве примераобрабатываемыхсимволов только символы русскогоязыка.
В языке С#, как ив языке С, символьные константы представляют из себя запись символав окружениииз апострофов (одиночных кавычек).
Знать и помнить наизусть числовые значения UNICODE-кодов для тех или иных конкретных символов не нужно, ведь для этого можно воспользоваться следующей простейшей программой, которая выведет всю необходимую нам информацию в свое консольноеокно:
Листинг 1.
1.namespace string_app
2.{
3.class Program
4.{
5.static void Main(string[] args)
6.{
7.char[] chAr = {'A','/','Ф','Ж'};
8.int[] iCode = new int[chAr.Length];
9.for( int i = 0; i < chAr.Length; ++i )
10.{
11.iCode[i] = (int)chAr[i];
12.Console.WriteLine( "Для {0} код равен {1}",chAr[i], iCode[i] ) ;
13.}
14.}
15.}
16.}
Здесь в массив chAr типа char [ ] помещены два русских символа - 'Ф' и 'Ж', английский символ 'А', а также символ обратной наклонной черты. С последним символом в языке С# ситуация та же самая, что и в языке С - он выполняет роль маркера начала управляющих символов (\п -перевод строки, \t - табуляция и т. д.), так что его самого приходится изображать в виденабораиздвухсимволов наклоннойчерты.
Символы из массива chAr [ ] легко преобразуются в обычные целочисленные значения типа int с помощью операцииявногоприведения типов:
iCode[i] = (int)chAr[i];
МетодWriteLine () выводит в консольноеокно элементы массива chAr в формесимволов, а
3
Строки в С#
элементы массива iCode[i] - в формечисловых кодов этих символов.
Запускаем программу с Листинга 1 на выполнение и видим нужную нам информацию по
UNICODE-кодам (см. рис. 1).
Рисунок 1: Результат работы программы Листинг 1
Из рис. 1 видно, что в UNICODE-кодировке английскому символу А соответствует числовой код 65, символу обратной наклонной чертой - код 92, русской букве Ф - числовой код1060, русскойбукве Ж - код1046.
Ясно, что UNOCODE-коды английских букв, цифр, знаков препинания и тому подобных символов те же самые, что и в ASCII-кодировке. Следующая программа показывает коды управляющихсимволов \n и \t:
Листинг 2.
1.class Program
2.{
3.static void Main(string[] args)
4.{
5. char x = '\n', y = '\t' ;
6. int ix = (int)x, iy = (int)y;
7. Console.WriteLine( "Символ \\n имеет код {0}", ix ); 8. Console.WriteLine( "Символ \\t имеет код {0}", iy ); 9. Console.ReadLine();
10.}
11.}
Компилируем программу, запускаем ее на выполнение и получаем ответ на наш вопрос
(см. рис. 2).
4
Строки в С#
Рисунок 2: Результат работы программы Листинг 2
Рис. 2 показывает, что управляющему символу \п соответствует числовой UNICODE-код 10 (в десятичной записи), а управляющему символу табуляции \t соответствует числовой код
9.
Другое дело, это коды символов некоторых национальных языков. Из рис. 1 видно, что русским буквам соответствует совсем иной диапазон значений UNI-CODE-кодов (больше 1000), для нагляднойдемонстрациикоторогопредназначенаследующая программа:
Листинг 3.
1.namespace string_app
2.{
3.class Program
4.{
5.static void Main(string[] args)
6.{
7.char x = (char)1040;
8.Console.WriteLine("UNICODE\t\tSymbol");
9.Console.WriteLine("----------------------------");
10.for (int i = 0; i < 66; ++i, ++x)
11.{
12.Console.WriteLine("{0}\t\t{1}", x, 1040 + i);
13.}
14.}
15.}
16.}
Данная программа, используя управляющие символы табуляции, порождает наглядный табличный вывод в консольное окно информации о UNICODE-кодах русских букв (см. рис.
3).
5
Строки в С#
Рисунок 3: Результат работы программы Листинг 3
Заметим, что в языке С#, в отличие от языков C/C++, переменной типа char нельзя напрямую присвоить числовое значение, так как возникает ошибка компиляции. Поэтому в Листинге 3 мы используемоперациюявногоприведения типовданных:
char х = (char)1040;
То же самое присваивание можно выполнить, используя апострофы и шестнадцатеричную форму записи для десятичногочисла 1040:
char х = '\u0410';
И, наконец, самое большое отличие типа char языка С# от одноименного типа данных языков C/C++ заключается в том, что этот встроенный тип данных строится на базе библиотечного класса с именем Char (определен в пространстве имен System). Ранее мы столкнулись с подобным явлением на примере массивов языка С# и здесь все то же самое (маленькое отличие - данный класс, то есть абстрактный тип данных Char, определяется не ключевым словом class, а другим ключевым словом - struct, что влечет за собой определенныеотличия, ноонив нашемпособиидля простоты нерассматриваются).
Тип Char содержит набор чрезвычайно практически полезных статических методов, позволяющих запросить тип символа - буква или нет, большая буква (заглавная) или строчная, знак лиэто пунктуацииитак далее. Вот иллюстрирующий примернаэту тему:
Листинг 4.
1.namespace string_app
2.{
3.class Program
4.{
5.static void Main(string[] args)
6.{
7. char xl = '\n', x2 = 'ж', x3 = '7'; 8. if( Char.IsWhiteSpace( xl ) )
9. Console.WriteLine( "\\п - управляющий символ" );
10. if( Char.IsLetter( x2 ) )
6