§ 2. Представление текстовой информации в компьютере

Всякий текст состоит из символов - букв, цифр, знаков препинания и т. д., - которые человек различает по начертанию. Однако для компьютерного представления текстовой информации такой метод неудобен, а для компьютерной обработки текстов - и вовсе неприемлем. Используется другой способ: все символы кодируются числами, и текст представляется в виде набора чисел - кодов символов, его составляющих. При выводе текста на экран монитора или принтер необходимо восстановить изображения всех символов, составляющих данный текст. Для этого используются кодовые таблицы символов, в которых для каждого символа устанавливается соответствие между его кодом и изображением. Все кодовые таблицы, используемые в любых компьютерах и любых операционных системах, подчиняются международным стандартам кодирования символов.

Основой для компьютерных стандартов кодирования символов послужил ASCII (American Standard Code for Information Interchange) - американский стандартный код для обмена информацией, разработанный в 1960-х годах и применяемый в США для любых видов передачи информации. В нём используется `7`-битное кодирование: общее количество символов составляет `2^7=128`, из них первые `32` символа - «управляющие», а остальные - «изображаемые», т. е. имеющие графическое изображение. Управляющие символы должны восприниматься устройством вывода текста как команды, например:

Cимвол

Действие

Английское название

№7

Подача стандартного звукового сигнала

Beep

№8

Затереть предыдущий символ

Back Space (BS)

№13

Перевод строки

Line Feed (LF)

№26

Конец текстового файла

End Of File (EOF)

№27

Отмена предыдущего ввода

Escape (ESC)


К изображаемым символам в ASCII относятся буквы английского (латинского) алфавита (заглавные и прописные), цифры, знаки препинания и арифметических операций, скобки и некоторые специальные символы. Фрагмент кодировки ASCII приведён в таблице.


Символ

Десятичный код

Двоичный код

Символ

Десятичный код

Двоичный код

Пробел

`32`

`00100000`

`0`

`48`

`00110000`

`!`

`33`

`00100001`

`1`

`49`

`00110001`

#

`35`

`00100011`

`2`

`50`

`00110010`

$

`36`

`00100100`

`3`

`51`

`00110011`

`**`

`42`

`00101010`

`4`

`52`

`00110100`

`+`

`43`

00101011

5

53

`00110101`

,

`44`

`00101100`

`6`

`54`

`00110110`

`–`

`45`

`00101101`

`7`

`55`

`00110111`

.

`46`

`00101110`

`8`

`56`

`00111000`

/

`47`

`00101111`

`9`

`57`

`00111001`

`A`

`65`

`01000001`

`N`

`78`

`01001110`

`B`

`66`

`01000010`

`O`

`79`

`01001111`

`C`

`67`

`01000011`

`P`

`80`

`01010000`

`D`

`68`

`01000100`

`Q`

`81`

`01010001`

`E`

`69`

`01000101`

`R`

`82`

`01010010`

`F`

`70`

`01000110`

`S`

`83`

`01010011`

`G`

`71`

`01000111`

`T`

`84`

`01010100`

`H`

`72`

`01001000`

`U`

`85`

`01010101`

`I`

`73`

`01001001`

`V`

`86`

`01010110`

`J`

`74`

`01001010`

`W`

`87`

`01010111`

`K`

`75`

`01001011`

`X`

`88`

`01011000`

`L`

`76`

`01001100`

`Y`

`89`

`01011001`

`M`

`77`

`01001101`

`Z`

`90`

`01011010`


Хотя в ASCII символы кодируются `7`-ю битами, в памяти компьютера под каждый символ отводится ровно `1` байт (`8` бит). И получается, что один бит из каждого байта не используется.

Главный недостаток стандарта ASCII заключается в том, что он рассчитан на передачу только текста, состоящего из английских букв. Со временем возникла необходимость кодирования и неанглийских букв. Во многих странах для этого стали разрабатывать расширения ASCII-кодировки, в которых применялись однобайтные коды символов; при этом первые `128` символов кодовой таблицы совпадали с кодировкой ASCII, а остальные (со `128`-го по `255`-й) использовались для кодирования букв национального алфавита, символов национальной валюты и т. п. Из-за несогласованности этих разработок для многих языков было создано по нескольку вариантов кодовых таблиц (например, для русского языка их около десятка).

Впоследствии использование кодовых таблиц было несколько упорядочено: каждой кодовой таблице было присвоено особое название и номер. Указав кодовую таблицу, автоматически выбирают и язык, которым можно пользоваться в дополнение к английскому; точнее, выбирается то, как будут интерпретироваться символы с кодами более `127`.

Для русского языка наиболее распространёнными являются однобайтовые кодовые  таблицы СР-`866`, Windows-`1251`, ISO `8859-5` и КОИ-`8`. В них первые `128` символов совпадают с ASCII-кодировкой, а русские буквы помещены во второй части таблицы (с номерами `128-255`), однако коды русских букв в этих кодировках различны! Сравните, например, кодировки КОИ-`8` (Код Обмена Информацией `8`-битный, международное название «koi-`8`r») и Windows-`1251`, фрагменты которых приведены в таблицах на странице `13`.

Несовпадение кодовых таблиц приводит к ряду неприятных эффектов: один и тот же текст (неанглийский) имеет различное компьютерное представление в разных кодировках, соответственно, текст, набранный в одной кодировке, будет нечитабельным в другой!

Однобайтовые кодировки обладают одним серьёзным ограничением: количество различных кодов символов в отдельно взятой кодировке недостаточно велико, чтобы можно было пользоваться одновременно несколькими языками. Для устранения этого ограничения в 1993-м году был разработан новый стандарт кодирования символов, получивший название Unicode, который, по замыслу его разработчиков, позволил бы использовать в текстах любые символы всех языков мира.


В Unicode на кодирование символов отводится `32` бита. Первые `128` символов (коды `0-127`) совпадают с таблицей ASCII, все основные алфавиты современных языков полностью умещаются в первые `65536` кодов  (`65536=2^16`), а в целом стандарт Unicode описывает все алфавиты современных и мёртвых языков; для языков, имеющих несколько алфавитов или вариантов написания (например, японский и индийский), закодированы все варианты; внесены все математические и иные научные символьные обозначения, и даже - некоторые придуманные языки (например, письменности эльфов и Мордора из эпических произведений Дж.Р.Р. Толкиена). Потенциальная информационная ёмкость Unicode столь велика, что сейчас используется менее одной тысячной части возможных кодов символов!

В современных компьютерах и операционных системах используется укороченная, `16`-битная версия Unicode, в которую входят все современные алфавиты; эта часть Unicode называется базовой многоязыковой страницей (Base Multilingual Plane, BMP).