Русский Журнал / Net-культура /
www.russ.ru/netcult/20021225_revich.html

Полный CHARSET (продолжение)
Юрий Ревич

Дата публикации:  25 Декабря 2002

В конце 50-х - начале 60-х годов в США был распространен семибитный код, известный как FIELDATA. Это было очевидно "потолочное" решение - он несовместим ни с чем и ни в чем. Символы в нем произвольным образом перемешаны с управляющими командами, причем сами команды явно избыточны: например, наряду с полным набором прописных и строчных букв присутствуют и команды переключения "Upper Case/Lower Case". Вообще "технические условия" под общим названием FIELDATA включали не только кодировку, но и спецификации электрических параметров, разьемов и пр. - код был предназначен для аппаратного кодирования/декодирования и использовался, например, в компьютерах UNIVAC. О FIELDATA, известном еще под названием "DoD standard", можно было бы вообще не вспоминать, если бы он не сохранился чуть ли не до нашего времени в старом ПО, написанном на Коболе, для которого первоначально был выбран именно этот стандарт представления символов.

В 1963 г. возник, а в 1967-м был утвержден в качестве стандарта American Standard Code for Information Interchandge - ASCII, который и является до сих пор основой всех кодовых таблиц. У истоков ASCII стояли AT&T и IBM. Полноты картины ради следует упомянуть, что для мейнфреймов IBM вплоть до начала 80-х годов принят другой код - EBCDIC, довольно громоздко устроенный и ведущий свое происхождение от перфокарт. Но с ним подавляющему большинству компьютерных пользователей столкнуться вряд ли случится. А вот ASCII...

Сам по себе "американский стандарт" задуман был неплохо. Собственно стандарт ASCII определяет только семибитный код, то есть с его помощью можно закодировать 128 символов. Этого достаточно, чтобы представить 52 латинские буквы (строчные и прописные), цифры, знаки препинания, арифметические действия, различные скобки и наиболее употребительные спецсимволы, вроде знака доллара или процента. Кроме того, с целью придания стандарту большей универсальности, коды с номерами 1-31 (код 0 не используется) отведены под команды принимающему устройству, среди которых есть как никому не нужные теперь "звонок" или "запрос", так и широко употребляющиеся "конец строки" и "перевод каретки" (интересно, что почти все современные принтеры адекватно реагируют, например, на код 12, который означает "извлечь страницу"). Код 32 означает "пробел". Для национальных расширений разработчики оставили вторую половину восьмибитной таблицы - коды от 128 до 256, где в оригинале содержались буквы с диакритическими знаками, некоторые спецсимволы и символы псевдографики, позволявшие, например, оформить текст в виде таблицы или нарисовать символ интеграла. Задумано было неплохо, но тут-то все и началось.

По какой причине разработчики первых серверов для передачи текстовых сообщений решили ограничиться семью битами - мне неизвестно. Возможно, они использовали восьмой бит для контроля четности. Не думаю, что они таким образом хотели отрезать Америку и Англию от остального мира, но факт, что тем, кто использовал вторую половину таблицы в своих национальных целях, пришлось срочно что-то придумывать, иначе вместо текста, использующего вторую половину таблицы, на приемном конце получался бессмысленный набор байтов, каждый из которых отличался от исходного ровно на 128 в меньшую сторону.

Французам и другим европейцам было проще других. Они могли просто ограничить себя в использовании диакритических знаков, к тому же в ASCII, кроме всего прочего, имеется такая команда, как Backspace, с кодом 08, которая позволяла на матричном принтере вернуть каретку назад и напечатать поверх предыдущего символа нужный значок, имитируя диакритические знаки. Русским же и другим несчастным, пользующимся кириллицей, пришлось хуже. Так в середине 70-х возник КОИ, в котором русские буквы во второй половине таблицы ставились на такие места, чтобы при вычитании 128 из кода получалась соответствующая по звучанию (но не всегда - по написанию) английская буква, причем в противоположном регистре, чтобы отличить английский текст от русского. Скажем, слова "Русский Текст" превратились бы в "rUSSKIJ tEKST". Хотя разработчикам нельзя отказать в остроумии, но выглядело это дело уже тогда, мягко говоря, доморощенно. Однако фактом остается то, что долгое время КОИ-8 существовал в виде общесоюзного стандарта (ГОСТ-19768-74) и даже чуть было не был утвержден в качестве международного (ISO-IR-111 или ECMA-Cyrillic). И сейчас KOI-8r (вообще кодировок с общим названием КОИ существует по меньшей мере семь) как был, так и остался самым распространенным стандартом для электронной почты, и в славные времена создания Релкома, в конце 80-х, был возведен в ранг Интернет-стандарта под названием RFC-1489. Тут, конечно, сыграло свою роль то, что он и был к тому времени стандартом де-факто (подкрепленным авторитетом ГОСТа) для Unix-систем, которые доминировали в сетевых делах.

Ну что ж, КОИ так КОИ - мало ли существует дурацких стандартов, которые, однако, приходится соблюдать? Но не тут-то было. КОИ-8, кроме своей, так сказать, совместимости с семибитным ASCII, в остальном был страшно неудобен. Например, символы псевдографики в нем превращались в русские буквы или вообще незнамо во что. Поэтому те, кто не был плотно завязан на сети, стали разрабатывать свои кодировки - кому какая удобнее. Одна из них даже сменила КОИ-8 в качестве общесоюзного стандарта (ГОСТ 19768-87). Нет никаких сомнений, что такой выбор из множества имевшихся вариантов экспертами Госстандарта был обусловлен исключительно "потолочными" соображениями. Потому что эта кодировка (ГОСТ, кстати, действует и поныне) не имеет ровно никаких преимуществ перед КОИ, кроме разве того, что коды строчных букв отличаются от кодов прописных букв на 32, как и в английской части таблицы, и еще стали доступны некоторые специальные знаки из расширенной ASCII с номерами 240-256 (например, довольно часто требующиеся значки градуса температуры или "плюс/минус"). Еще больше путаницы в это дело добавили специалисты из ISO, которые включили новый порядок кириллических букв в международный стандарт под названием ISO-8859-5 (как же - ГОСТ все таки!), но остальную часть таблицы заполнили всякими национальными буквами - в целях наибольшей универсальности, как утверждалось. Поэтому не только ГОСТ, но и стандарт ISO оказались настолько нестандартными, что их решительно никто не использует. В перечень доступных кодировок в меню, например, MSIE ISO-8859-5 включена, надо полагать, из вежливости по отношению к ISO - вдруг кому-то в голову придет ее использовать? Сам Госстандат сейчас спокойно приветствует посетителей на своем сайте в кодировке Win1251.

Из всех возникших в конце восьмидесятых кириллических кодировок наибольшее распространение получила так называемая "альтернативная" кодировка. Своим названием она обязана тому, что была выдвинута как альтернатива никому не нужному ГОСТу. Сейчас она более известна как CP866 (Code Page 866) или как кодировка MS DOS. Пожалуй, это самая продуманная из всех кодировок. Прежде всего на своих местах остались символы псевдографики и многие другие спецсимволы из второй половины ASCII - то есть оформленный с их помощью английский текст абсолютно не менялся независимо от текущей кодовой страницы. Некоторым неудобством стало то, что русские символы располагались в таблице с разрывом - строчная буква "п" имела номер 175, а "р" и далее начинались с номера 224, и еще буквы "Ё" и "ё" замещали довольно часто употребляемые символы 240 (знак тождества) и 241 (плюс/минус), что иногда приводило к разным некрасивостям. Но это недостатки простительные - на фоне беспредела, который творился вокруг! Так как кроме "альтернативной" в начальный период распространения персоналок в странах СЭВа действовали еще и болгарская MIC (которая до сих пор используется в болгарской Linux), и какая-то "польская" (которая даже не упоминается на сайте >czyborra.com, на котором собраны, кажется, все существующие кодировки вообще), и "украинская", и почти все разновидности КОИ, и CP855, в которой символы кириллицы расположены совершенно иначе, чем в CP866...

Это он во всем виноват!Но все это безобразие, казалось, почти прекратилось с приходом на одну шестую часть суши русифицированной Windows. В версии 3.х, которая была фактически просто графическо-многозадачной надстройкой над DOS, использовалась еще СР866. Но корпорация Микрософт никогда не ходила проторенными путями и всегда считала, что она сама себе - стандарт. Поэтому с выпуском Win-95 она проигнорировала не только кириллические стандарты (официальные или нет), но даже и вообще сложившееся построение второй половины таблицы ASCII, отчасти справедливо рассудив, что символы псевдографики при наличии графических WYSIWYG-редакторов как-то ни чему. Кириллическая азбука волюнтаристски заняла последние 64 ячейки таблицы, кроме опять же букв "Ё" и "ё", которые вставили куда-то в середину. Новая кодировка получила название "Windows 1251". Интересно, что внедрением и CP866 в 1989 году, и Win1251 в 1995 занимался один и тот же человек - россиянин Петр Квитек (сейчас он возглавляет компанию "Коммунивер.сеть"). Итого, на данный момент на просторах нашей Родины имеются как минимум три реально действующие кодировки - КОИ-8, Win1251 и CP866, она же MS DOS. Если не считать менее распространенных, например, кодировки Mac, которая используется на компьютерах Apple.

(продолжение следует)