Глава 20
ASCII — символы
нашего времени
В памяти компьютера могут содержаться только биты, поэто-
му любую информацию, которую мы рассчитываем сохранить,
сначала нужно преобразовать в цифровую форму. В том, что
битами можно представлять числа и команды, мы уже убеди-
лись. Пора заняться текстом. Ведь именно в виде текста — книг,
журналов, газет — накоплена большая часть информации в
нашем мире. Конечно, со временем мы захотим хранить на
компьютере и звуки, и рисунки, и видеозаписи, но начинать
нужно с самого легкого — с букв.
Для представления текста в цифровом формате мы долж-
ны придумать систему кодирования, в которой каждой букве
соответствовал бы уникальный код. Свои коды понадобятся и
для цифр, и для знаков препинания, поскольку без них в тек-
сте не обойтись. Короче, нам нужны коды для всех буквенно-
цифровых (alphanumeric) символов. Такие системы иногда на-
зывают наборами кодированных символов (coded character set),
а отдельно взятый код — кодом символа (character code).
Прежде всего мы должны задаться вопросом: а сколько
битов нам понадобится для этих кодов? Вопрос не из легких.
Размышляя о цифровом представлении текста, не будем
забегать вперед. Текст, который мы привыкли видеть на стра-
ницах книг, журналов и газет, как правило, отформатирован
358
Глава двадцатая
— по меньшей мере разбит на абзацы со строками заданной
длины. Но для понимания смысла текста это форматирова-
ние несущественно. Прочитав рассказ в журнале, а затем мно-
го лет спустя встретив его в книге, мы не считаем, что рассказ
изменился только потому, что в книге он разбит на строки
большей длины.
Иными словами, откажемся пока от представления о тек-
сте как об отформатированных абзацах на двумерной печат-
ной странице. Будем считать его одномерным потоком букв,
цифр, знаков препинания и, возможно, дополнительных сим-
волов, указывающих на окончание абзаца.
Столь же малое значение имеет и то, что в журнале и книге
рассказ набран разными шрифтами. Журнальная версия на-
чинается так:
Зовите меня Исмаил.
а книжная — так:
Зовите меня Исмаил.
Ну и стоит ли нам из-за этого переживать? Наверное, нет. Да,
конечно, шрифт влияет на восприятие текста, но смысл рас-
сказа не изменится от изменения шрифта. Кроме того, исход-
ный шрифт всегда можно вернуть.
Продолжаем упрощать задачу. Мы откажемся не только от
шрифта, но и от различных его начертаний: ни полужирного,
ни курсива, ни подчеркивания, ни цвета, ни верхних и нижних
индексов, ни диакритических знаков. Никаких
. Толь-
ко простой текст, набранный 26 буквами латинского алфавита.
На самом деле с двоичным представлением букв мы уже стал-
кивались, когда говорили об азбуках Морзе и Брайля. Обе эти
системы кодирования прекрасно работают там, где должны ра-
ботать, но для компьютеров они малопригодны. В азбуке Мор-
зе, например, коды имеют разную длину: короткими кодами
обозначаются часто используемые буквы, длинными — менее
популярные. Телеграфисты, конечно, этому рады, но вот в ком-
пьютере такое кодирование было бы неудобным. Кроме того, в
азбуке Морзе не различаются прописные и строчные буквы.
В шрифте Брайля все символы имеют одну и ту же длину —
в компьютерах это предпочтительнее. Каждая буква представ-
лена 6 битами. Прописные и строчные буквы различаются, хотя
359
ASCII — символы нашего времени
для этого применяется специальный escape-код, указывающий,
что следующая за ним буква — прописная. Фактически это зна-
чит, что для кодирования прописных букв нужен не один код, а
два. Цифры представляются с помощью кода переключения.
Стоящие после него символы интерпретируются как цифры,
пока следующий код переключения не укажет на необходимость
возврата к буквенной интерпретации.
Наша цель — разработать систему кодирования, в кото-
рой предложение
У меня 27 сестер.
шифровалось бы набором кодов, состоящих из заданного чис-
ла битов. Одни коды будут обозначать буквы, другие — знаки
препинания, третьи — цифры. Отдельный код понадобится
даже для представления пробела между словами. В приведен-
ном предложении 17 символов (включая пробелы). Последо-
вательность кодов для представления таких предложений час-
то называют текстовой строкой (string).
Необходимость введения специальных кодов для цифр
может показаться странной. На протяжении многих глав мы
записывали числа в двоичном представлении, с какой же ста-
ти теперь не кодировать цифры 2 и 7 в нашем предложении
как 10 и 111? Но на самом деле оказывается, что цифры удоб-
но кодировать наравне с буквами, поэтому коды цифр в тек-
сте не связаны с их реальным численным значением.
Вероятно, самым экономичным текстовым кодом можно
считать 5-битовый код, разработанный в 1874 г. для печатаю-
щего телеграфного аппарата служащим французской теле-
графной службы Эмилем Бодо (Emile Baudot). «На вооруже-
ние» этот код был принят в 1877 г. Позже этот код модернизи-
ровал Дональд Мюррей (Donald Murray), а в 1931 г. комитет
CCITT (Comit Consultatif International T l graphique et
T l phonique), известный теперь как Международный теле-
коммуникационный союз (International Telecommunication
Union, ITU), принял его в качестве стандарта. Официальное
название этого кода — Международный телеграфный алфа-
вит №2 (International Telegraph Alphabet No. 2, ITA-2), но в про-
сторечии его по-прежнему называют кодом Бодо, хотя пра-
вильнее было бы называть его кодом Мюррея.
В XX в. кодировку Бодо часто применяли в телетайпных
аппаратах. Клавиатура аппарата Бодо напоминает клавиатуру
360
Глава двадцатая
обычной пишущей машинки за исключением того, что состо-
ит она всего из 30 клавиш и пробела. Клавиши телетайпа яв-
ляются по сути электрическими переключателями. Их нажа-
тие приводит к генерации двоичного кода и его посылке по
выходному кабелю, один бит за другим. Кроме того, в теле-
тайпный аппарат входит печатающее устройство. Коды, по-
ступающие в телетайп по входному кабелю, управляют элект-
ромагнитами, которые отпечатывают на бумаге соответству-
ющие символы.
Поскольку система Бодо является 5-битовой, в ней всего
32 кода, принимающих шестнадцатеричные значения от 00h
до 1Fh. В таблице показано их соответствие буквам алфавита.
Шестнадцате- Буква Бодо
Шестнадцате- Буква Бодо
ричный код
ричный код
00
10
E
01
T
11
Z
02
Возврат каретки 12
D
03
O
13
B
04
Пробел
14
S
05
H
15
Y
06
N
16
F
07
M
17
X
08
Перевод строки 18
A
09
L
19
W
0A
R
1A
J
0B
G
1B
Переключение
на цифры
0C
I
1C
U
0D
P
1D
Q
0E
C
1E
K
0F
V
1F
Переключение
на буквы
Код 00h в системе не используется. Из оставшихся кодов 26
обозначают буквы латинского алфавита, и еще 5 имеют спе-
циальные значения.
361
ASCII — символы нашего времени
Код 04h соответствует пробелу, т. е. интервалу между слова-
ми. Коды 02h и 08h называются возвратом каретки (Carriage
Return) и переводом строки (Line Feed). Эта терминология про-
исходит от пишущих машинок. Когда, печатая на машинке, вы
доходите до конца строки, вам нужно сделать две вещи (обычно
с помощью специального рычага или кнопки) — во-первых, сдви-
нуть каретку до упора вправо, чтобы начать следующую строку
у левого края бумаги (это и есть возврат каретки), во-вторых,
прокрутить валик, чтобы новая строка началась ниже только что
напечатанной (это перевод строки). В аппаратах Бодо для генера-
ции двух этих кодов использовались разные клавиши.
Но где же в кодировке Бодо цифры и знаки препинания? А
вот для них-то и нужен код 1Bh — переключение на цифры.
Все коды, следующие за ним, интерпретируются как цифры и
знаки препинания, пока в последовательности кодов не попа-
дется 1Fh — переключение на буквы. Вот какие коды исполь-
зуются для цифр и знаков препинания.
Шестнадцате- Буква Бодо
Шестнадцате- Буква Бодо
ричный код
ричный код
00
10
3
01
5
11
+
02
Возврат каретки 12
Кто это?
03
9
13
?
04
Пробел
14
‘
05
#
15
6
06
,
16
$
07
.
17
/
08
Перевод строки 18
-
09
)
19
2
0A
4
1A
Сигнал
0B
&
1B
Переключение
на цифры
0C
8
1C
7
0D
0
1D
1
0E
:
1E
(
0F
=
1F
Переключение
на буквы
362
Глава двадцатая
В стандарте ITU коды 05h, 0Bh и 16h не заданы. Предполагается,
что в каждом языке у них собственные значения. В таблице дана
их расшифровка, принятая в США. В Европе эти же коды иног-
да используются для обозначения букв с диакритическими зна-
ками. Получив код Сигнал, телетайп издает звуковой сигнал. В
ответ на код «Кто это?» телетайп передает данные о себе.
Как и в азбуке Морзе, в кодировке БОДО прописные и
строчные буквы не различаются. Предложение:
I SPENT $25 TODAY.
(Сегодня я потратил 25 долларов) кодируется последователь-
ностью шестнадцатеричных кодов:
0C 04 14 0D 10 06 01 04 1B 16 19 01 1F 04 01 03 12 18 15
1B 07 02 08
где используется три кода-переключателя: 1Bh перед числом,
1Fh после числа и еще один код 1Bh перед точкой. В конце стро-
ки стоят коды возврата каретки и перевода строки.
К сожалению, если вы направите эту последовательность
на печатающее устройство два раза подряд, то получите в ре-
зультате нечто подобное:
I SPENT $25 TODAY.
8 ’03,5 $25 TODAY.
Что произошло? В конце первой строки на печатающее уст-
ройство был подан код переключения на цифры, поэтому сим-
волы в начале второй строки интерпретируются как цифры и
знаки препинания.
Подобные неприятности — прямое следствие использования
кодов-переключателей. Хотя код Бодо, безусловно, очень эконо-
мичен, для цифр, знаков препинания, а также строчных и про-
писных букв предпочтительнее использовать отдельные коды.
Посчитаем, сколько битов нам понадобится для системы
кодирования, которая была бы лучше системы Бодо. Итак, нам
нужно 52 кода для прописных и строчных латинских букв и
еще 10 кодов для цифр от 0 до 9. Это уже 62. Добавьте несколь-
ко знаков препинания, и рубеж в 64 кода перейден, т. е. 6-ю
битами мы не обойдемся. С другой стороны, до следующего
рубежа в 128 кодов нам пока далеко, а значит, 8 битов нам не
понадобится.
363
ASCII — символы нашего времени
Получаем ответ: для представления текстов, написанных
латинскими буквами с различающимися строчными и пропис-
ными буквами, нам нужны 7-битовые коды.
Как должны выглядеть эти коды? Да как угодно. Если бы
мы самостоятельно собрали компьютер и все периферийное
оборудование к нему, а также самостоятельно разработали все
программы к нему да еще никогда не пытались бы соединить
его с другими компьютерами, мы могли бы придумать систе-
му кодов самостоятельно. Для этого достаточно приписать
каждому символу уникальное сочетание семи нулей и единиц.
Но в реальности компьютеры редко существуют сами по
себе. Для обмена информацией всем пользователям лучше
договориться и применять одни и те же коды. После этого тек-
стовую информацию легко можно будет переносить с одного
компьютера на другой.
При разработке кодов, вероятно, стоит учесть и другие со-
ображения. Например, коды буквам лучше назначать упоря-
доченно: последовательные коды последовательным буквам
алфавита. В будущем это весьма облегчит сортировку текста.
Стандартная система кодирования текста, конечно, уже со-
здана. Она называется Американским стандартным кодом для
обмена информацией (American Standard Code for Information
Interchange, ASCII). Кодировка ASCII была принята в 1967 г.
и по сей день остается одним из важнейших стандартов
компьютерной индустрии. За одним большим исключением
(о нем позже) кодировка ASCII применяется в компьютерах
практически при любых работах с текстом.
ASCII — это 7-битовая кодировка. Ее коды принимают зна-
чения от 0000000 до 1111111 или в шестнадцатеричном выра-
жении от 00h до 7Fh. Постепенно мы рассмотрим их все, толь-
ко начнем не с самого начала. В каком-то смысле понять на-
значение первых 32 символов сложнее, чем остальных, поэто-
му мы сначала познакомимся со второй 32-кодовой группой,
в которую включены цифры и знаки препинания.
Шестнадцате- Символ ASCII
Шестнадцате- Символ ASCII
ричный код
ричный код
20
Пробел
30
0
21
!
31
1
22
"
32
2
364
Глава двадцатая
Шестнадцате- Символ ASCII
Шестнадцате- Символ ASCII
ричный код
ричный код
23
#
33
3
24
$
34
4
25
%
35
5
26
&
36
6
27
‘
37
7
28
(
38
8
29
)
39
9
2A
*
3A
:
2B
+
3B
;
2C
,
3C
<
2D
-
3D
=
2E
.
3E
>
2F
/
3F
?
Обратите внимание на символ 20h — это пробел для разделе-
ния слов и предложений.
В следующую группу из 32 кодов входят прописные буквы
и дополнительные знаки препинания, которых на клавиатуре
пишущих машинок, как правило, нет.
Шестнадцате- Символ ASCII
Шестнадцате- Символ ASCII
ричный код
ричный код
40
@
50
P
41
A
51
Q
42
B
52
R
43
C
53
S
44
D
54
T
45
E
55
U
46
F
56
V
47
G
57
W
48
H
58
X
49
I
59
Y
4A
J
5A
Z
( продолжение)
365
ASCII — символы нашего времени
4B
K
5B
[
4C
L
5C
\
4D
M
5D
]
4E
N
5E
^
4F
O
5F
_
Следующая группа из 32 кодов — строчные буквы и еще
несколько знаков препинания.
Шестнадцате- Символ ASCII
Шестнадцате- Символ ASCII
ричный код
ричный код
60
‘
70
p
61
a
71
q
62
b
72
r
63
c
73
s
64
d
74
t
65
e
75
u
66
f
76
v
67
g
77
w
68
h
78
x
69
i
79
y
6A
j
7A
z
6B
k
7B
{
6C
l
7C
|
6D
m
7D
}
6E
n
7E
~
6F
o
Заметьте: символа, соответствующего коду 7Fh, в таблице
нет. Если вы еще не сбились со счета, то знаете, что всего в
трех таблицах я описал 95 кодов. Поскольку кодировка ASCII
является 7-битовой, в ней доступно всего 128 кодов, значит,
осталось описать еще 33. Вы узнаете о них буквально через пару
минут.
Текстовая строка:
Hello, you!
(продолжение)
366
Глава двадцатая
в кодировке ASCII представляется кодами:
48 65 6C 6C 6F 2C 20 79 6F 75 21
Помимо кодов букв, в ней встречаются коды запятой (2Ch),
пробела (20h) и восклицательного знака (1h). Взгляните на еще
одно короткое предложение:
I am 12 years old.
и его представление в формате ASCII:
49 20 61 6D 20 31 32 20 79 65 61 72 73 20 6F 6C 64 2E
Заметьте: число 12 в этой строке представлено кодами 31h и
32h, т. е. ASCII-кодами цифр 1 и 2. Если число 12 — часть тек-
ста, для его представления нельзя применять шестнадцатерич-
ные коды 01h и 02h, или BCD-код 12h, или его шестнадцате-
ричное представление 0Ch. Все эти числа в кодировке ASCII
означают что-то другое.
Коды прописных букв в ASCII отличаются от кодов соот-
ветствующих строчных букв на 20h. Благодаря этому легко на-
писать программу, которая заменяла бы все строчные буквы в
текстовой строке прописными. Допустим, некоторую область
в памяти занимает текстовая строка, по 1 байту на символ. Ниже
в подпрограмме для процессора 8080 считается, что адрес пер-
вого символа строки записан в паре регистров HL; в регистре С
хранится длина строки в символах:
Capitalize: MOV A,C
; C = число оставшихся символов
CPI A,00h
; Сравнить с 0
JZ AllDone ; Если С = 0, закончить
MOV A,[HL] ; Извлечь следующий символ
CPI A,61h
; Меньше, чем "a"?
JC SkipIt
; Если да, игнорировать
CPI A,7Bh
; Больше, чем "z"?
JNC SkipIt ; Если да, игнорировать
SBI A,20h
; Буква строчная, значит,
; вычитаем 20h
MOV [HL],A ; Сохранить символ
367
ASCII — символы нашего времени
SkipIt:
INX HL
; Перейти к следующему символу
DCR C
; Уменьшить счетчик на 1
JMP Capitalize
; Вернуться к началу
AllDone:
RET
Оператор, в котором из кода строчной буквы вычитается 20h
для преобразования ее в прописную, можно заменить на:
ANI A,DFh
Команда ANI (AND Immediate) выполняет побитовую опера-
цию И между содержимым аккумулятора и числом DFh или в
двоичном представлении 11011111. Побитовой я называю опе-
рацию, выполняемую отдельно для каждой пары битов, со-
ставляющих ее операнды. Эта операция И сохраняет неизмен-
ными все биты аккумулятора, кроме третьего слева, который
устанавливается в 0. Его обнуление эквивалентно вычитанию
20h, т. е. преобразованию строчной буквы в прописную.
Описанные до сих пор 95 кодов относятся к отображаемым
символам, т. е. к символам, у которых есть внешний вид. В на-
боре ASCII есть также 33 управляющих символа, которые при
печати или на экране не отображаются, а используются для
выполнения тех или иных действий. Для полноты я привожу
их все, но не переживайте, если какие-то покажутся вам не-
понятными. Формат ASCII изначально разрабатывался для те-
летайпных аппаратов, поэтому многие его коды сейчас уже утра-
тили смысл.
Шестнадцате- Сокращение Название
Назначение
ричный код
00
NUL
Null
Нет
01
SOH
Start of
Начало заголовка
Heading
02
STX
Start of Text Начало текста
03
ETX
End of Text
Конец текста
04
EOT
End of
Конец передачи
Transmission
05
ENQ
Enquire
Запрос
(Inquire)
06
ACK
Acknowledge Подтверждение
368
Глава двадцатая
(продолжение)
Шестнадцате- Сокращение Название
Назначение
ричный код
07
BEL
Bell
Сигнал
08
BS
Backspace
Возврат на символ
назад
09
HT
Horizontal
Горизонтальная
Tabulation
табуляция
0A
LF
Line Feed
Перевод строки
0B
VT
Vertical
Вертикальная
Tabulation
табуляция
0C
FF
Form Feed
Извлечение
страницы
0D
CR
Carriage
Возврат каретки
Return
0E
SO
Shift Out
Выход
0F
SI
Shift In
Вход
10
DLE
Data Link
Escape
11
DC1
Device
Управление
Control 1
устройством 1
12
DC2
Device
Управление
Control 2
устройством 2
13
DC3
Device
Управление
Control 3
устройством 3
14
DC4
Device
Управление
Control 4
устройством 4
15
NAK
Negative
Нет
Acknowledge подтверждения
16
SYN
Synchronous Синхронизация
Idle
17
ETB
End of
Конец блока
Transmission передачи
Block
18
CAN
Cancel
Отмена
19
EM
End of
Конец носителя
Medium
369
ASCII — символы нашего времени
1A
SUB
Substitute
Замена
Character
1B
ESC
Escape
1C
FS
File Separa-
Разделитель
tor or In-
файлов или
formation
информации 4
Separator 4
1D
GS
Group Sepa- Разделитель групп
rator or In-
или
formation
информации 3
Separator 3
1E
RS
Record Sepa- Разделитель
rator or In-
записей или
formation
информации 2
Separator 2
1F
US
Unit Separa- Разделитель
tor or Infor- элементов или
mation
информации 1
Separator 1
7F
DEL
Delete
Удаление
Смысл некоторых из этих символов в том, что их можно
размещать среди отображаемых символов, внося в текст не-
кое примитивное форматирование. Представьте себе устрой-
ство для печати (телетайп или принтер), отображающее на
бумаге символы, руководствуясь поступающими на него
ASCII-кодами. Обычно устройство работает так: печатающая
головка печатает символ, соответствующий коду, и сдвигает-
ся на одну позицию вправо. Важнейшие управляющие симво-
лы нужны, чтобы изменить эту последовательность.
Рассмотрим в качестве примера шестнадцатеричную строку
41 09 42 09 43 09
Код 09h соответствует символу горизонтальной табуляции, или
просто табулятору. Символ табуляции сдвигает печатающую
головку к следующей позиции, номер которой кратен 8. Ре-
зультат выглядит примерно так:
A
B
C
(продолжение)
370
Глава двадцатая
Табуляцию удобно применять, когда при печати текст должен
выравниваться по столбцам.
Даже многие современные принтеры реагируют на код 12h,
извлекая страницу и начиная печать на новой.
Код 08h (BS) позволяет печатать составные символы на ста-
рых принтерах. Так, для печати буквы е с диакритическим зна-
ком — обратным апострофом ( ) на принтер нужно передать
последовательность кодов 65h 08h 60h.
Важнейшими управляющими символами и в наши дни
являются символы возврата каретки и перевода строки, дей-
ствие которых аналогично соответствующим кодам Бодо. Код
CR смещает печатающую головку принтера к левому краю
страницы, а LF приводит к прокрутке валика на одну строку
вверх. Для начала новой строки обычно надо указывать оба
кода. Но допускается их применение и по отдельности, ска-
жем, для печати новой строки поверх старой или для начала
новой строки не у левого поля.
В мире персональных компьютеров кодировка ASCII — бе-
зусловный лидер, но на крупных компьютерных системах фир-
мы IBM она не используется. Для вычислительной машины
System/360 фирма IBM разработала собственный 8-битовый код
EBCDIC (Extended BCD Interchange Code, расширенный код об-
мена BCD). Это расширенный вариант 6-битового кода BCDIC,
применявшегося в перфокартах IBM в течение 50 лет.
ABCDEFGHIJKLMNOPQRSTUVWXYZ
0123456789
00000000000000000000000000000000000000000000000000000000000000000000000000000000
11111111111111111111111111111111111111111111111111111111111111111111111111111111
22222222222222222222222222222222222222222222222222222222222222222222222222222222
33333333333333333333333333333333333333333333333333333333333333333333333333333333
44444444444444444444444444444444444444444444444444444444444444444444444444444444
55555555555555555555555555555555555555555555555555555555555555555555555555555555
66666666666666666666666666666666666666666666666666666666666666666666666666666666
77777777777777777777777777777777777777777777777777777777777777777777777777777777
88888888888888888888888888888888888888888888888888888888888888888888888888888888
99999999999999999999999999999999999999999999999999999999999999999999999999999999
1 2 3
5
4
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
1 2 3
5
4
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
IBM 8081
Разбираясь во взаимосвязях между перфокартами и соответ-
ствующими кодами EBCDIC, помните, что на развитие этой
кодировки влияло несколько различных технологий. Поэто-
му не стоит ожидать от нее чрезмерной логичности или внут-
ренней согласованности.
371
ASCII — символы нашего времени
Для кодирования символа в столбце цифр на перфокарте
пробивается несколько прямоугольных отверстий. Для яснос-
ти поверх столбца часто печатали закодированный символ.
Нижние 10 строк пронумерованы от 0 до 9. Ненумерованная
строка над 0-й строкой считается 11-й, а самая верхняя строка
— 12-й. Десятой строки на карте нет. Всего на одной карте 80
столбцов, а значит закодировать с ее помощью можно 80 сим-
волов.
Строки с 0-й по 9-ю иногда называют цифровыми строка-
ми или цифровой пробивкой (digital punches), строки 11 и 12
— зонными строками или зонной пробивкой (zone punches).
Чтобы жизнь не казалась медом, иногда зонной пробивкой
считаются и отверстия в строках 0 и 9.
8-битовый код EBCDIC состоит из старшей и младшей тет-
рад. Младшая является кодом BCD, соответствующим циф-
ровой пробивке символа. Старшая содержит код, соответству-
ющий (довольно произвольным образом) зонной пробивке
символа. Как вы помните из главы 19, в кодировке BCD 4-би-
товые коды используются для представления цифр от 0 до 9.
У кодов цифр от 0 до 9 зонной пробивки нет, т. е. старшая
тетрада равна 1111, младшая — BCD-коду цифры.
Шестнадцатеричный код
Символ EBCDIC
F0
0
F1
1
F2
2
F3
3
F4
4
F5
5
F6
6
F7
7
F8
8
F9
9
При кодировании прописных букв тетрада 1100 соответ-
ствует зонной пробивке только в строке 12, тетрада 1101 —
зонной пробивке только в строке 11, тетрада 1110 — зонной
пробивке в строке 0. Вот как выглядят коды EBCDIC для про-
писных букв латинского алфавита:
372
Глава двадцатая
Шестнад- Символ Шестнад- Символ
Шестнад-
Символ
цатерич- EBCDIC цатерич- EBCDIC
цатерич-
EBCDIC
ный код
ный код
ный код
C1
A
D1
J
C2
B
D2
K
E2
S
C3
C
D3
L
E3
T
C4
D
D4
M
E4
U
C5
E
D5
N
E5
V
C6
F
D6
O
E6
W
C7
G
D7
P
E7
X
C8
H
D8
Q
E8
Y
C9
I
D9
R
E9
Z
Заметьте: коды не образуют сплошной последовательности.
При программной обработке текста EBCDIC эти пробелы в
нумерации крайне неудобны.
Коды строчных букв обозначаются той же цифровой про-
бивкой, что и коды прописных букв, но иной зонной пробив-
кой. В кодах строчных букв от a до i пробиты строки 12 и 0,
чему соответствует код 1000. В кодах строчных букв от j до r
пробиты строки 12 и 11 (код 1001). Наконец, в кодах строчных
букв от s до z пробиты строки 11 и 0 (код 1010).
Шестнад- Символ Шестнад- Символ
Шестнад-
Символ
цатерич- EBCDIC цатерич- EBCDIC
цатерич-
EBCDIC
ный код
ный код
ный код
81
a
91
j
82
b
92
k
A2
s
83
c
93
l
A3
t
84
d
94
m
A4
u
85
e
95
n
A5
v
86
f
96
o
A6
w
87
g
97
p
A7
x
88
h
98
q
A8
y
89
i
99
r
A9
z
373
ASCII — символы нашего времени
Конечно, в EBCDIC есть и другие коды — для знаков препина-
ния и для управляющих символов, но нам вряд ли имеет смысл
тратить время на столь глубокое знакомство с этой системой.
Теоретически каждого столбца на перфокарте достаточно
для кодирования 12 битов информации (1 отверстие — 1 бит).
С другой стороны, для записи 7-битового кода ASCII можно в
каждом столбце использовать 7 из 12 строк. Но на практике
приходится учитывать, что карта, в которой пробито слиш-
ком много отверстий, довольно скоро ветшает.
Многие из 8-битовых кодов EBCDIC остались неопределен-
ными. Это значит, что смысла в 7-битовой кодировке ASCII
больше. Во времена разработки ASCII память для компьюте-
ров стоила очень дорого, поэтому некоторые даже настаива-
ли, что для экономии памяти кодировка должна быть 6-бито-
вой, а для набора строчных и прописных букв нужен код-пе-
реключатель. Однако эта идея скоро была отвергнута, уступив
место представлению о том, что кодировка ASCII должна быть
8-битовой. Это связано с тем, что в основе компьютерной ар-
хитектуры лежит не 7-, а 8-битовая единица — байт. И конеч-
но, хотя технически основная кодировка ASCII остается 7-би-
товой, для хранения отдельных символов в компьютерах по-
чти всегда отводится 8 битов.
Эквивалентность байтов и символов довольно удобна: мы
всегда может приблизительно сказать, сколько места в памяти
займет тот или иной документ, попросту подсчитав количе-
ство символов в нем. Некоторым людям легче представить себе
объем памяти компьютера, если они могут сказать, сколько
текста можно в ней разместить.
Например, обычная машинописная страница займет в па-
мяти около 1 700 байт. На странице журнала «The New Yorker»
три колонки текста по 60 строк в каждой. При средней длине
строки в 40 знаков получаем объем страницы 7 200 символов
(или байт). На странице «The New York Times» текст разделен
на 6 колонок. Если бы в нем не было ни заголовков, ни фотогра-
фий (что в высшей степени необычно), всего в каждой колонке
умещалось бы 155 строк длиной по 35 символов. Значит, объем
страницы равен 32 550 символов, или 32 килобайта.
На книжной странице обычного формата помещается бо-
лее 400 слов. При средней длине слова в 7 символов (точнее, в
8, так как за каждым словом идет пробел) объем книжной стра-
374
Глава двадцатая
ницы равен примерно 3 000 символов. Примем, что объем ти-
пичной книги — 333 страницы. У этого, прямо скажем, не-
круглого числа, есть одно преимущество — оно позволяет нам
уверенно заявить, что типичная книга занимает в памяти объем
около 1 000 000 байт, или 1 Мб.
Конечно, вокруг этого среднего есть значительный разброс.
«Великий Гетсби» Френсиса Скотта Фицджеральда — око-
ло 300 кб.
«Над пропастью во ржи» Джерома Сэлинджера — около
400 кб.
«Приключения Гекльберри Финна» Марка Твена — около
540 кб.
«Гроздья гнева» Джона Стейнбека — около 1 Мб.
«Моби Дик» Германа Мелвилла — 1,3 Мб.
«История Тома Джонса, найденыша» Генри Филдинга —
2,25 Мб.
«Унесенные ветром» Маргарет Митчел — 2,5 Мб.
«Война и мир» Льва Толстого — 3,9 Мб.
«В поисках утраченного времени» Марселя Пруста — 7,7 Мб.
В библиотеке Конгресса Соединенных Штатов Америки 20
млн. книг, 20 триллионов символов, 20 терабайт текстовых
данных (кроме них, еще масса фотографий и аудиозаписей).
Несмотря на важность, стандарт ASCII далеко не идеален.
Беда американского кода для обмена информацией в том, что
он слишком американский! Он едва ли удовлетворит даже тре-
бования народов, говорящих по-английски. Значок доллара в
ASCII есть, но где же значок английского фунта? Где в нем бук-
вы с диакритическими знаками, применяемые в большинстве
западноевропейских языков? Я уж молчу о нелатинских алфа-
витах — греческом, арабском, иврите, кириллице. А слоговое
письмо брахми в Индии и Юго-Восточной Азии, к которому
восходят языки деванагари, бенгали, тайский и тибетский?
Наконец, как прикажете представлять с помощью 7-битового
кода десятки тысяч иероглифов китайского, японского и ко-
рейского языков?
При разработке ASCII потребности других алфавитов учи-
тывались мало, хотя, конечно, о нелатинских алфавитах речь
не шла. В стандарте ASCII считается, что 10 его кодов (40h, 5Bh,
5Ch, 5Dh, 5Eh, 60h, 7Bh, 7Ch, 7Dh и 7Eh) другие страны могут
переопределять согласно своим потребностям. Кроме того,
375
ASCII — символы нашего времени
предусматривалась возможность замены символа # значком
английского фунта , а знака доллара $ — обобщенным сим-
волом денежной единицы ¤. Очевидно, замена имеет смысл,
лишь когда о ней знают все работающие с документом, кото-
рый содержит переопределенные коды.
Поскольку в большинстве компьютерных систем симво-
лы все равно хранятся как 8-битовые значения, возникает воз-
можность расширения набора символов ASCII до 256 симво-
лов. В расширенной кодировке значения кодов с 00h до 7Fh
остались неизменными, а коды с 80h по FFh соответствуют
буквам с диакритическими знаками или буквам нелатинских
алфавитов. Вот, например, как шифруются в расширенной
кодировке ASCII кириллические буквы. В таблице старшая тет-
рада шестнадцатеричного кода символа указана в первой стро-
ке, а младшая — в левом столбце.
8-
9-
A-
E-
-0
А
Р
а
р
-1
Б
С
б
с
-2
В
Т
в
т
-3
Г
У
г
у
-4
Д
Ф
д
ф
-5
Е
Х
е
х
-6
Ж
Ц
ж
ц
-7
З
Ч
з
ч
-8
И
Ш
и
ш
-9
Й
Щ
й
щ
-A
К
Ъ
к
ъ
-B
Л
Ы
л
ы
-C
М
Ь
м
ь
-D
Н
Э
н
э
-E
О
Ю
о
ю
-F
П
Я
п
я
К сожалению, на протяжении последних десятилетий появи-
лось множество различных вариантов расширения таблицы
ASCII даже для одного языка, что, конечно же, приводит к мно-
гочисленным сложностям. Наиболее радикальным изменени-
376
Глава двадцатая
ям кодировка ASCII подверглась ради включения в нее китайс-
ких, японских и корейских иероглифов. В популярной кодиров-
ке Shift-JIS (Japan Industrial Standard, японский промышленный
стандарт) коды с 81h по 9Fh в действительности представляют
собой первый байт 2-байтового кода символа. Благодаря этому
в кодировке Shift-JIS удается дополнительно закодировать око-
ло 6 000 дополнительных символов. К сожалению, эта кодиров-
ка — не единственная. Кроме нее в Азии применяются еще три
варианта двухбайтовых наборов символов.
Наличие нескольких несовместимых двухбайтовых набо-
ров — не единственная проблема. Есть еще одна: некоторые
символы, а именно обычные символы ASCII, представляются
одним байтом, тогда как другие — тысячи иероглифов — дву-
мя. Конечно, работать с такими наборами очень трудно.
Осознав необходимость единой и всеобщей системы коди-
рования символов, которая подходила бы для всех языков
мира, в 1988 г. несколько крупных компьютерных компаний
начали разработку кодировки Unicode, которая должна прий-
ти на смену ASCII. В отличие от ASCII кодировка Unicode яв-
ляется не 7-, а 16-битовой. По 2 байта занимают все символы
Unicode до единого. Это значит, что в Unicode коды принима-
ют значения от 0000h до FFFFh, а всего их доступно 65 536.
Этого достаточно для любых языков мира, по крайней мере
для тех, что будут использоваться в компьютерах, да еще и
остается место для расширения.
Создание Unicode начиналось не на пустом месте. Первые
128 символов — с кодами от 0000h до 007Fh — совпадают с
символами ASCII. Далее нашлось место и для греческих, и для
кириллических, и для арабских букв, и для множества других
символов.
Преимущества Unicode несомненны, но это, увы, не облег-
чает ее внедрения. ASCII и ее многочисленные расширения на-
столько распространены в компьютерном мире, что сместить
их с пьедестала будет очень нелегко.
Правда, в Unicode удобное равенство «1 символ = 1 байт»
уже не соблюдается. В кодировке ASCII роман «Гроздья гнева»
занимает 1 мегабайт, в кодировке Unicode — уже 2 Мб. Но пра-
во же, это небольшая плата за универсальную всеобщую сис-
тему кодирования символов.
|