Кодовые страницы

Алфавит из 256 символов достаточно обширен, чтобы вместить буквы (прописные и строчные) для пары европейских языков, цифры, джентльменский набор знаков пунктуации и ещё кое-что по мелочам.

Но надо учитывать, что человечество изобрело огромное количество значков, которые даже столь большой алфавит не вместит. Даже если нам не потребуется так много знаков в одном тексте, и мы ограничимся только перечисленным выше, возникает проблема: каким образом поставить в соответствие значки из ограниченного набора числам из диапазона 0‥255. Если на одном компьютере буква A кодируется числом 65, а на другом как-нибудь иначе, переданный с одной компьютерной системы на другую текст не будет правильно прочитан.

Требуются стандарты, которые устанавливали бы такое соответствие.

Первый шаг к стандартизации предпринял Американский национальный институт стандартов — ANSI. Выработанный институтом стандарт ASCII — American Standard Code for Information Interchange (американский стандартный код для обмена информацией) заполняет первую половину кодовой таблицы — места от 0 до 127. Заполнение второй половины таблицы данный стандарт не регламентирует. Читать таблицу нужно слева направо сверху вниз. В принципе символов в этой половине кодовой таблицы достаточно для программирования на большинстве алгоритмических языков.


В кодовой странице ASCII отсутствуют не-латинские буквы.

Международная организация по стандартизации ISO предложила несколько стандартов, описывающих варианты заполнения второй половины кодовой таблицы. Например, кодовая страница ISO8859-1, называемая также в простонародье latin1, удобна для большинства европейских языков, основанных на латинице.


История кириллических (то есть поддерживающих кириллицу) кодовых страниц сложна. Их общая черта состоит в том, что их первые половины заполнены в соответствии с ASCII, поэтому здесь не приводятся.

Одной из наиболее древних, по-видимому, является KOI8-R, родившаяся в мире ЭВМ под управлением ОС Unix. Довольно странный порядок кириллических букв имеет объяснение. Обратите внимание на то, что для представления символов ASCII достаточно семи бит. Иными словами, все ASCII-символы закодированы при помощи байтов вида 0*******. Установка самого левого, сброшенного бита в таком байте равносильна прибавлению числа 128 к коду. Это прибавление даёт тот же самый эффект, что и наложение верхней половины кодовой таблицы на нижнюю. И наоборот, сбрасывание этого бита сдвигает каждый символ в таблице вверх на 8 строчек.

В старые времена, когда байты были не восьми-, а семибитные (самый левый бит использовался для контроля ошибок при передаче информации между компьютерными системами), символы из нижней половины страницы могли утратить свой заветный левый бит. Кодировка KOI8-R гарантировала, что такой текст останется более-менее читаемым. Например, при порче текста Кодовая страница получится kODOWAQ STRANICA.

У кодовой страницы KOI8-R имеются украинский вариант KOI8-U, а также вариант KOI8-C с дореформенными русскими буквами (ятями, фитами, ижицами), и буквами балканских языков с кириллической графикой.


Кодовая страница CP866, которую называли ещё альтернативной кодировкой ГОСТ, получила большое распространение в нашей стране на компьютерах под управлением ОС Microsoft DOS. Была также и так называемая основная кодировка ГОСТ, но она так и не получила широкого распространения, так же как и кодировка ISO8859-5, предложенная организацией ISO для поддержки кириллицы.

У кодировки CP866 уже меньше проблем с алфавитным порядком (если не говорить про многострадальную букву Ёё, и специфические буквы украинского и белорусского алфавитов). Однако имеется досадный разрыв между буквами п и р, заполненный значками для рисования рамок.


Наиболее совершенной кажется кодовая страница CP1251, предложенная фирмой Microsoft для использования в ОС Microsoft Windows.


Обилие разнообразных кодовых страниц создаёт проблемы при передаче текстов между разными компьютерными системами.

К каждому передаваемому тексту необходимо прилагать сопроводительную информацию об использованной кодовой странице.

Если передающая и принимающая сторона используют разные кодовые страницы, необходимо перекодирование. Такое перекодирование несложно запрограммировать, однако нужно иметь в виду, что не всякие тексты следует перекодировать. К примеру, исполняемые программы не должны перекодироваться, поскольку составляющие их байты не имеют того смысла, что символы в естественном языке (скажем, русском). Эти байты служат кодами команд процессора. То же самое относится к другим типам двоичных файлов: файловым архивам, графическим, аудио- и видеофайлам. Некоторые типы файлов (например, HTML) допускают размещение информации об использованной кодировке внутри этих файлов. Чтобы сохранить состоятельность таких файлов, кроме перекодирования необходимо соответствующим образом исправить эту информацию. Дополнительные трудности возникают, если файлы, подлежащие перекодированию, упакованы в файловый архив. В этом случае принимающей стороне потребуется распаковать архив, перекодировать входящие в него файлы, и затем упаковать обратно. Настоящий кошмар наступает, если имена файлов в архиве тоже нужно перекодировать (это важная причина, по которой следует избегать в именах файлов символов, не входящих в ASCII).

Из-за того, что разные кодировки могут содержать различные наборы символов, процесс перекодирования не всегда корректно определён. Скажем, символ (длинное тире) имеется в кодовой странице CP1251 и отсутствует в CP866. Что должно происходить при перекодировании с таким символом?

Наконец, небольшой размер кодовой страницы либо лишает нас возможности использовать в одном тексте всё многообразие символов, придуманных человечеством. Скажем, ни одна из описанных в предыдущем разделе кириллических кодовых страниц не позволит записать такой текст:

Информатика-54© А. Н. Швец