3.3Обработка символьной информации в Паскале
____________________________________________________________________
психологии, теории игр и т.д.
Компьютеры широко применяются для набора различных текстов и доку-
ментов, перевода текстов. Компьютеры сочиняют музыку, пишут стихи, играют
вшахматы. Конечно, при решении таких задач вычисления производятся, но не
втаком объеме, как при решении вычислительных задач. В основном в нечи-
словых задачах компьютер оперирует с символьной информацией.
Необходимо понимать, что вся информация, хранящаяся в памяти компью-
тера, представлена в виде двоичных чисел. Все дело в том, что под этими дво-
ичными числами понимается, действительно ли это какие-то числа или что-
либо другое. Так вот под "другое" имеются в виду символы или совокупность символов. Т.е. каждый символ кодируется в виде двоичных чисел. Только об-
рабатываются эти числа совершенно по-другому. Программист знает, когда он работает с числами, когда с символами и поэтому предусматривает для каждого случая соответствующие способы работы с этими числами. А в памяти компь-
ютера двоичное представление символа или группы символов может совпадать с каким-нибудь "настоящим" числом.
Примечательно, что возможность применения компьютеров для решения нечисловых задач понимали еще тогда, когда и компьютеров-то вообще не бы-
ло! Вот что писала знаменитая Ада Лавлейс еще в 1843 году: "Многие не све-
дущие в математике люди думают, что поскольку назначение аналитической машины Бэббиджа – выдавать результаты в численном виде, то природа проис-
ходящих в ней процессов должна быть арифметической и численной, а не ал-
гебраической и аналитической. Но они ошибаются. Машина может упорядочи-
вать и комбинировать числовые значения так же, как и буквы или любые дру-
гие символы общего характера. В сущности, при выполнении соответствующих условий она могла бы выдавать результаты и в алгебраическом виде".
В 1963 г. американская организация по стандартизации American Standards Association (ASA) предложила для представления символов, т.е. цифр, букв и других знаков специальный семибитный код, который стал называться кодовой
166
Глава 3 Более сложные элементы языка
____________________________________________________________________
таблицей ASCII (American Standard Code for Information Interchange). Номер,
который символ имеет в таблице ASCII, называется кодом этого символа. Сим-
вол можно представить, указав его в кавычках, а можно использовать значок #,
за которым следует код символа. Например, буква 'А', в таблице ASCII
имеет номер 65, т е. его код равен 65, тогда можно указать # 65 и это будет оз-
начать букву 'А'.
Однако эта кодовая таблица содержала кроме цифр и знаков только буквы английского алфавита. Поэтому был принят стандарт на 8-битную таблицу
ASCII, в которой первые 128 символов оставались те же, что и в 7-битной таб-
лице, а символы с 128 по 255 отводились для не английских символов. Позднее
Microsoft расширила таблицу ASCII и она была переименована и стала назы-
ваться ANSI (American National Standards Institute). В таблице 3.4. приведена первая половина (с кодами 0…127) этого стандарта.
Как мы видим, первая половина таблицы содержит все буквы латинского алфавита, цифры от 0 до 9, а также все наиболее употребимые знаки, такие как знак +, -, /, *, скобки и т.д.
Вторая половина символов с кодами 128…255 меняется для различных на-
циональных алфавитов. С появлением национальных локализаций для второй половины таблицы ASCII было введено понятие «кодовая страница» (code page, CP). Для кодирования русских букв в MS DOS стали применять кодировку
CP866, ранее известную как альтернативная кодировка ВЦ Академии Наук
СССР.
В Windows для представления кириллицы используется кодовая страница
CP-1251. Стандартные Windows-шрифты Arial Cyr, Courier New Cyr и Times New Roman Cyr для представления символов кириллицы (без букв 'ѐ' и 'Ё')
используют последние 64 кода (от 192 до 256): 'А'…'Я' кодируются значе-
ниями 192…223, 'а'…'я' – 224…255.
А в консоли Windows используется кодировка CP866. Этим и объясняются проблемы при выводе русских букв на экран в консольных приложениях.
167
3.3Обработка символьной информации в Паскале
____________________________________________________________________
Кодировка символов в соответствии со стандартом ANSI
|
|
|
|
|
|
|
Таблица 3.4 |
|
Код |
Символ |
Код |
Символ |
Код |
Символ |
Код |
|
Символ |
0 |
NUL |
32 |
BL |
64 |
@ |
96 |
|
` |
1 |
SOH |
33 |
! |
65 |
A |
97 |
|
a |
2 |
STX |
34 |
― |
66 |
B |
98 |
|
b |
3 |
ETX |
35 |
# |
67 |
C |
99 |
|
c |
4 |
EOT |
36 |
$ |
68 |
D |
100 |
|
d |
5 |
ENQ |
37 |
% |
69 |
E |
101 |
|
e |
6 |
ACK |
38 |
& |
70 |
F |
102 |
|
f |
7 |
BEL |
39 |
' |
71 |
G |
103 |
|
g |
8 |
BS |
40 |
( |
72 |
H |
104 |
|
h |
9 |
HT |
41 |
) |
73 |
I |
105 |
|
i |
10 |
LF |
42 |
* |
74 |
J |
106 |
|
j |
11 |
VT |
43 |
+ |
75 |
K |
107 |
|
k |
12 |
FF |
44 |
, |
76 |
L |
108 |
|
l |
13 |
CR |
45 |
- |
77 |
M |
109 |
|
m |
14 |
SO |
46 |
. |
78 |
N |
110 |
|
n |
15 |
SI |
47 |
/ |
79 |
O |
111 |
|
o |
16 |
DEL |
48 |
0 |
80 |
P |
112 |
|
p |
17 |
DC1 |
49 |
1 |
81 |
Q |
113 |
|
q |
18 |
DC2 |
50 |
2 |
82 |
R |
114 |
|
r |
19 |
DC3 |
51 |
3 |
83 |
S |
115 |
|
s |
20 |
DC4 |
52 |
4 |
84 |
T |
116 |
|
t |
21 |
NAK |
53 |
5 |
85 |
U |
117 |
|
u |
22 |
SYN |
54 |
6 |
86 |
V |
118 |
|
v |
23 |
ETB |
55 |
7 |
87 |
W |
119 |
|
w |
24 |
CAN |
56 |
8 |
88 |
X |
120 |
|
x |
25 |
EM |
57 |
9 |
89 |
Y |
121 |
|
y |
25 |
SUB |
58 |
: |
90 |
Z |
122 |
|
z |
27 |
ESC |
59 |
; |
91 |
[ |
123 |
|
{ |
28 |
FS |
60 |
< |
92 |
\ |
124 |
|
| |
28 |
GS |
61 |
= |
93 |
] |
125 |
|
} |
30 |
RS |
62 |
> |
94 |
^ |
126 |
|
~ |
31 |
US |
63 |
? |
95 |
_ |
127 |
|
• |
Существуют и другие стандарты кодировки символов. В частности, для представления букв некоторых языков, таких как китайский, японский, корей-
ский и др. 8-ми разрядов не хватает. Поэтому разработан специальный стандарт
Unicode.
168
Глава 3 Более сложные элементы языка
____________________________________________________________________
Юникод, или Уникод (Unicode) — стандарт кодирования символов, позво-
ляющий представить знаки практически всех письменных языков.
Стандарт предложен в 1991 году некоммерческой организацией «Консор-
циум Юникода» (Unicode Consortium, Unicode Inc.). Применение этого стандар-
та позволяет закодировать очень большое число символов из разных письмен-
ностей: в документах Unicode могут соседствовать китайские иероглифы, ма-
тематические символы, буквы греческого алфавита, латиницы и кириллицы,
при этом становятся ненужными кодовые страницы.
Стандарт состоит из двух основных разделов: универсальный набор сим-
волов (UCS, Universal Character Set) и семейство кодировок (UTF, Unicode
Transformation Format).
Универсальный набор символов задаѐт однозначное соответствие симво-
лов кодам — элементам кодового пространства, представляющим неотрица-
тельные целые числа.
Семейство кодировок определяет машинное представление последова-
тельности кодов UCS.
Коды в стандарте Юникод разделены на несколько областей. Область с ко-
дами от U+0000 до U+007F содержит символы набора ASCII с соответствую-
щими кодами. Далее расположены области знаков различных письменностей,
знаки пунктуации и технические символы. Часть кодов зарезервирована для использования в будущем.
В Lazarus по умолчанию используется кодировка UTF-8. В UTF-8 все сим-
волы разделены на несколько групп. Символы с кодами менее 128 кодируются одним байтом, первый бит которого равен нулю, а последующие 7 бит в точно-
сти соответствуют первым 128 символам 7-битной таблицы ASCII, следующие
1920 символов – кодируются двумя байтами. Последующие символы кодиру-
ются тремя и четырьмя байтами.
Для нас важным является тот факт, что символы кириллицы кодируются в
UTF-8 в точности двумя байтами.
169
3.3Обработка символьной информации в Паскале
____________________________________________________________________
Как уже отмечалось в 2.1.8. Lazarus представляет собой среду с графиче-
ским интерфейсом для быстрой разработки программ и базируется на ориги-
нальной кроссплатформенной библиотеке визуальных компонент LCL (Lazarus Component Library). Разработчиками Lazarus предложено использовать UTF-8 в LCL в качестве универсальной кодировки на всех платформах. Поэтому LCL
содержит, кроме визуальных компонентов, функции преобразования UTF-8 в
кодировку, с которой работает консоль на каждой из платформ. Функция
UTF8ToConsole() объявлена в модуле FileUtil, которая является частью LCL.
Вот почему мы должны были в наши консольные проекты добавлять библиоте-
ку LCL.
3.3.1.1. Тип Char
Для обозначения типа "символ" в Паскале используется зарезервированное слово char. Для хранения переменной типа "символ" требуется один байт па-
мяти, т.е. значением переменной типа char является один символ.
Напоминаю, что хотя компьютер обрабатывает символы, тем не менее, в
действительности он оперирует с числами, а точнее с кодами этих символов из кодовой таблицы. Таким образом, один символ может быть "больше", чем дру-
гой или "меньше". Это зависит от места расположения символов в таблице. На-
пример, символ (буква) 'B' "больше" буквы 'A', поскольку код 'B' (номер в кодовой таблице) равен 66, а код буквы 'A' равен 65 (буквы английского ал-
фавита, см. табл. 3.4.). В силу этого, над символьными переменными определе-
ны операции отношения: =, <, >, <>, <=, >=.
3.3.1.2. Функции для работы с символами
Для символьных переменных существуют следующие функции: chr(x) – возвращает значение символа по его коду;
ord(ch) – возвращает код символа ch;
170