[8-битные кодировки: ASCII, КОИ-8R и CP1251]
Первые таблицы кодировки, созданные в США, не использовали восьмой бит в байте. Текст представлялся как последовательность байт, но восьмой бит не учитывался (он применялся в служебных целях).
Общепризнанным стандартом стала таблица ASCII (American Standard Code for Information Interchange). Первые 32 символа таблицы ASCII (от 00 до 1F) использовались для непечатаемых символов. Они были предназначены для управления печатающим устройством и т. п. Остальная часть – от 20 до 7F – обычные (печатаемые) символы.
Таблица 1 - кодировка ASCII
Dec | Hex | Oct | Char | Описание символа |
0 |
0 |
000 |
|
null |
1 |
1 |
001 |
|
start of heading |
2 |
2 |
002 |
|
start of text |
3 |
3 |
003 |
|
end of text |
4 |
4 |
004 |
|
end of transmission |
5 |
5 |
005 |
|
enquiry |
6 |
6 |
006 |
|
acknowledge |
7 |
7 |
007 |
|
bell |
8 |
8 |
010 |
|
backspace |
9 |
9 |
011 |
|
horizontal tab |
10 |
A |
012 |
|
new line |
11 |
B |
013 |
|
vertical tab |
12 |
C |
014 |
|
new page |
13 |
D |
015 |
|
carriage return |
14 |
E |
016 |
|
shift out |
15 |
F |
017 |
|
shift in |
16 |
10 |
020 |
|
data link escape |
17 |
11 |
021 |
|
device control 1 |
18 |
12 |
022 |
|
device control 2 |
19 |
13 |
023 |
|
device control 3 |
20 |
14 |
024 |
|
device control 4 |
21 |
15 |
025 |
|
negative acknowledge |
22 |
16 |
026 |
|
synchronous idle |
23 |
17 |
027 |
|
end of trans. block |
24 |
18 |
030 |
|
cancel |
25 |
19 |
031 |
|
end of medium |
26 |
1A |
032 |
|
substitute |
27 |
1B |
033 |
|
escape |
28 |
1C |
034 |
|
file separator |
29 |
1D |
035 |
|
group separator |
30 |
1E |
036 |
|
record separator |
31 |
1F |
037 |
|
unit separator |
32 |
20 |
040 |
|
space |
33 |
21 |
041 |
! |
|
34 |
22 |
042 |
" |
|
35 |
23 |
043 |
# |
|
36 |
24 |
044 |
$ |
|
37 |
25 |
045 |
% |
|
38 |
26 |
046 |
& |
|
39 |
27 |
047 |
' |
|
40 |
28 |
050 |
( |
|
41 |
29 |
051 |
) |
|
42 |
2A |
052 |
* |
|
43 |
2B |
053 |
+ |
|
44 |
2C |
054 |
, |
|
45 |
2D |
055 |
- |
|
46 |
2E |
056 |
. |
|
47 |
2F |
057 |
/ |
|
48 |
30 |
060 |
0 |
|
49 |
31 |
061 |
1 |
|
50 |
32 |
062 |
2 |
|
51 |
33 |
063 |
3 |
|
52 |
34 |
064 |
4 |
|
53 |
35 |
065 |
5 |
|
54 |
36 |
066 |
6 |
|
55 |
37 |
067 |
7 |
|
56 |
38 |
070 |
8 |
|
57 |
39 |
071 |
9 |
|
58 |
3A |
072 |
: |
|
59 |
3B |
073 |
; |
|
60 |
3C |
074 |
< |
|
61 |
3D |
075 |
= |
|
62 |
3E |
076 |
> |
|
63 |
3F |
077 |
? |
|
|
Dec | Hex | Oct | Char |
64 |
40 |
100 |
@ |
65 |
41 |
101 |
A |
66 |
42 |
102 |
B |
67 |
43 |
103 |
C |
68 |
44 |
104 |
D |
69 |
45 |
105 |
E |
70 |
46 |
106 |
F |
71 |
47 |
107 |
G |
72 |
48 |
110 |
H |
73 |
49 |
111 |
I |
74 |
4A |
112 |
J |
75 |
4B |
113 |
K |
76 |
4C |
114 |
L |
77 |
4D |
115 |
M |
78 |
4E |
116 |
N |
79 |
4F |
117 |
O |
80 |
50 |
120 |
P |
81 |
51 |
121 |
Q |
82 |
52 |
122 |
R |
83 |
53 |
123 |
S |
84 |
54 |
124 |
T |
85 |
55 |
125 |
U |
86 |
56 |
126 |
V |
87 |
57 |
127 |
W |
88 |
58 |
130 |
X |
89 |
59 |
131 |
Y |
90 |
5A |
132 |
Z |
91 |
5B |
133 |
[ |
92 |
5C |
134 |
\ |
93 |
5D |
135 |
] |
94 |
5E |
136 |
^ |
95 |
5F |
137 |
_ |
96 |
60 |
140 |
` |
97 |
61 |
141 |
a |
98 |
62 |
142 |
b |
99 |
63 |
143 |
c |
100 |
64 |
144 |
d |
101 |
65 |
145 |
e |
102 |
66 |
146 |
f |
103 |
67 |
147 |
g |
104 |
68 |
150 |
h |
105 |
69 |
151 |
i |
106 |
6A |
152 |
j |
107 |
6B |
153 |
k |
108 |
6C |
154 |
l |
109 |
6D |
155 |
m |
110 |
6E |
156 |
n |
111 |
6F |
157 |
o |
112 |
70 |
160 |
p |
113 |
71 |
161 |
q |
114 |
72 |
162 |
r |
115 |
73 |
163 |
s |
116 |
74 |
164 |
t |
117 |
75 |
165 |
u |
118 |
76 |
166 |
v |
119 |
77 |
167 |
w |
120 |
78 |
170 |
x |
121 |
79 |
171 |
y |
122 |
7A |
172 |
z |
123 |
7B |
173 |
{ |
124 |
7C |
174 |
| |
125 |
7D |
175 |
} |
126 |
7E |
176 |
~ |
127 |
7F |
177 |
DEL |
|
Примечание: Dec означает десятичный код символа, Oct восьмеричный код символа, Hex шестнадцатеричный код символа, Char как символ выглядит.
Как легко заметить, в этой кодировке представлены только латинские буквы, причём те, которые используются в английском языке. Есть также арифметические и другие служебные символы. Но нет ни русских букв, ни даже специальных латинских для немецкого или французского языка. Это легко объяснить – кодировка разрабатывалась именно как американский стандарт. Когда компьютеры стали применяться во всём мире, потребовалось кодировать и другие символы.
Для этого было принято решение использовать восьмой бит в каждом байте. Тем самым оказались доступны ещё 128 значений (от 80 до FF), которые можно было использовать для кодирования символов. Первая из восьмибитных таблиц – "расширенный ASCII" (Extended ASCII) – включала в себя различные варианты латинских символов, применяемые в некоторых языках Западной Европы. Также в ней были другие дополнительные символы, включая псевдографику.
Таблица 2 - Extended ASCII
Псевдографические символы позволяют, выводя на экран только текстовые символы, обеспечивать некоторое подобие графики. При помощи псевдографики работает, например, программа для управления файлами FAR Manager.
Русских букв в таблице Extended ASCII не было. В России (ранее – СССР) и в других государствах создавались свои кодировки, позволяющие представлять в 8-битных текстовых файлах специфические "национальные" символы – латинские буквы польского и чешского языков, кириллицу (включая русские буквы) и другие алфавиты.
Во всех кодировках, получивших распространение, первые 127 символов (т.е. значения байта при восьмом бите, равном 0) совпадают с ASCII. Таким образом, файл в формате ASCII работает в любой из этих кодировок; буквы английского языка в них представлены одинаково.
Организация ISO (International Standardization Organization – Международная Организация по Стандартам) приняла группу стандартов ISO 8859. Она определяет 8-битные кодировки для разных групп языков. Так, ISO 8859-1 – это Extended ASCII, таблица для США и Западной Европы. А ISO 8859-5 – таблица для кириллицы (включая русский язык).
Однако по историческим причинам кодировка ISO 8859-5 не прижилась. Реально для русского языка применяются следующие кодировки:
– Code Page 866 (CP866), она же "DOS", она же "альтернативная кодировка ГОСТ". Широко применялась до середины 90-х годов; теперь используется ограниченно. Практически не применяется для распространения текстов в Интернете. – КОИ-8. Разработана в 70-80-е годы. Является общепринятым стандартом для передачи почтовых сообщений в российском Интернете. Широко применяется также в операционных системах семейства Unix, включая Linux. Вариант КОИ-8, рассчитанный на русский язык, называется КОИ-8R; существуют версии для иных кириллических языков (так, KOI8-U – вариант для украинского языка). – Code Page 1251, CP1251, Windows-1251. Разработана компанией Microsoft для поддержки русского языка в системе Windows.
Основным достоинством CP866 было сохранение символов псевдографики на тех же местах, что и в Extended ASCII; поэтому могли без изменений работать зарубежные текстовые программы, например, знаменитый Norton Commander. Ныне CP866 используется для программ под Windows, работающих в текстовых окнах или в полноэкранном текстовом режиме, включая FAR Manager.
Тексты в CP866 в последние годы встречаются довольно редко (зато она используется для кодирования русских имен файлов в Windows). Поэтому мы подробнее остановимся на двух других кодировках – КОИ-8R и CP1251.
Таблица 3. Кодировка КОИ-8R (символы с 80 по FF)
Таблица 4. Кодировка CP1251 (символы с 80 по FF)
Как можно заметить, в таблице кодировки CP1251 русские буквы расположены в алфавитном порядке (за исключением, правда, буквы Ё). Благодаря такому расположению компьютерным программам очень просто осуществлять сортировку по алфавиту.
А вот в КОИ-8R порядок русских букв кажется случайным. Но на самом деле это не так.
Во многих старых программах при обработке или передаче текста терялся 8-й бит. (Сейчас такие программы практически вымерли, но в конце 80-х – начале 90-х годов они были широко распространены). Чтобы получить из 8-битного значения 7-битное, достаточно отнять от старшей цифры 8; например, E1 превращается в 61.
А теперь сравните КОИ-8R с таблицей ASCII (табл.1). Вы обнаружите, что русские буквы поставлены в чёткое соответствие с латинскими. Если исчезнет восьмой бит, строчные русские буквы превращаются в заглавные латинские, а заглавные русские – в строчные латинские. Так, E1 в КОИ-8 – это русское "А", тогда как 61 в ASCII – латинское "a".
Итак, КОИ-8 позволяет сохранять читаемость русского текста при потере 8-го бита. "Привет всем" превращается в "pRIWET WSEM".
В последнее время и алфавитный порядок расположения символов в таблице кодировки, и читаемость при потере 8-го бита потеряли решающее значение. Восьмой бит в современных компьютерах не теряется ни при передаче, ни при обработке. А сортировка по алфавиту производится с учётом кодировки, а не простым сравнением кодов. (Кстати, коды CP1251 расположены не полностью по алфавиту – буква Ё не находится на своём месте).
Из-за того, что распространённых кодировок оказалось две, при работе с Интернетом (почта, просмотр Web-сайтов) иногда можно вместо русского текста увидеть бессмысленный набор букв. Например, "Я СБЮФЕМХЕЛ". Это всего лишь слова "с уважением"; но они были закодированы в кодировке CP1251, а компьютер декодировал текст по таблице КОИ-8. Если те же слова были, наоборот, закодированы в КОИ-8, а компьютер декодировал текст по таблице CP1251, результатом будет "У ХЧБЦЕОЙЕН".
Иногда бывает, что компьютер расшифровывает русскоязычные письма и вовсе по таблице, не предназначенной для русского языка. Тогда вместо русских букв появляются бессмысленный набор символов (например, латинские буквы восточно-европейских языков); их часто называют "крокозябрами".
В большинстве случаев современные программы справляются с определением кодировок документов Интернета (электронных писем и Web-страниц) самостоятельно. Но иногда они "дают осечку", и тогда можно увидеть странные последовательности русских букв или же "крокозябры". Как правило, чтобы в такой ситуации вывести на экран настоящий текст, достаточно выбрать кодировку вручную в меню программы.
[Ссылки]
1. Таблица символов ANSI. 2. http://2cyr.com/decode/?lang=ru. Универсальный декодер - конвертер кириллицы. Отличный сервис, позволяет разобраться с кракозябрами. |
Комментарии
Regards
RSS лента комментариев этой записи