Юрий Ревич, revich@computerra.ru
Этот материал Вы всегда сможете найти по его
постоянному адресу:
Русский Журнал/ Net-культура / www.russ.ru/netcult/20021223_revich.html
Полный CHARSET
Объективную реальность, которая нас окружает,
мы воспринимаем преломленной через органы
восприятия, которые воспроизводят в мозгу образы
окружающего мира - знаки. От того, как мозг
интерпретирует эти знаки-образы, во многом
зависит индивидуальное восприятие мира.
Немаловажную роль в этом деле играют и
собственно человеческие знаковые системы: речь,
письменность, музыка, искусства...
Языков, устных и письменных, может существовать
бесконечное множество - никто не мешает любому
сесть и изобрести свою собственную языковую
систему, причем такую, что она будет по своим
возможностям вполне адекватна любому (или почти
любому) другому языку. Так возник эсперанто,
изобретенный "с нуля" доктором Людвигом
Заменхоффом (это самый известный из
искусственных языков, но не единственный).
Кавычки я поставил потому, что Заменхофф был
европейцем, и естественно, что получился еще один
язык романской группы из индоевропейской семьи,
а не какой-нибудь тюркской или
китайско-тибетской. Так что еще вопрос, насколько
обоснованы претензии эсперантистов на
присвоение этому языку звания
"международного" - эсперанто не намного
более "международен", чем английский, к
примеру.
И обычные языки, возникшие естественным путем,
могут абсолютно ничем не напоминать друг друга,
как японский и английский, к примеру, однако, если
отвлечься от культурных особенностей наций -
носителей соответствующих языков, то перевод с
одного на другой в большинстве случаев может
быть осуществлен вполне адекватно (хотя эта
задача, как выяснилось недавно, в общем случае
является неалгоритмизируемой -
"невычисляемой" по Тьюрингу). В отличие от
музыки или, к примеру, пиктографии, языковые
знаковые системы являются чисто договорными. И
как раз по этой причине их так просто
реформировать, переходить с одного алфавита на
другой и совершать над ними прочие
издевательства - да и сами по себе языки в
историческом масштабе времени изменяются
чрезвычайно быстро: скажем, еще во времена
"Слова о полку Игореве" украинский,
белорусский и русский языки практически не
различались.
Тем интереснее проследить на примере
искусственно созданной системы, что может
произойти, если ее развивать бездумно и
волюнтаристски, руководствуясь чисто
прагматическими нуждами текущего момента без
какого-либо прицела на завтрашний день. Речь идет
о системах компьютерной кодировки текстовых
символов. Трудно встретить еще какую-либо
область человеческой деятельности, в процессе
развития которой разработчики столь старательно
расставляли бы грабли, добившись в конечном
итоге, что при всем старании не наступить на хоть
какие-нибудь стало просто невозможно.
Притом речь идет не только о
кодировках кириллицы - это просто крайний случай.
История цифрового кодирования алфавита даже
началась с нелепостей. Капитан французской армии
Шарль Барбье в 1819 году попытался разработать
систему "ночного письма", в котором
выпуклыми точками и тире на бумаге кодировались
не буквы, а, можете себе представить, - звуки!
Естественно, это было практически непригодная
для французского языка вещь. Не слишком большим
воображением обладал и основатель парижского
Королевского института слепых Валентин Ойи - он
придумал систему рельефных букв, которые можно
было читать, касаясь пальцами. Поэтому трудно
переоценить гениальность ослепшего в возрасте
трех лет Луи Брайля (Louis Braille, 1809-1852), который еще в
мальчишеском возрасте придумал
последовательную систему рельефных точек,
кодирующих буквы алфавита, цифры и знаки
препинания, которая, несколько дополненная,
используется и в наши дни. Базовый элемент
системы Брайля содержит 6 позиций-ячеек, каждая
из которых может быть выпуклой или плоской - то
есть она является двоичной. Всего ней можно
закодировать 26=64 символа, однако Брайлем
предусмотрен механизм практически
неограниченного расширения количества
кодируемых символов - для этого употребляются
коды-переключатели (shift-коды). Наличие такого
переключателя означает, что все последующие
знаки надо читать определенным образом
(например, как цифры, а не буквы), до тех пор, пока
не встретится другой подобный знак. Другая
разновидность переключающих кодов (escape-коды)
действует только на один знак после такого кода,
и тоже впервые введена в азбуке Брайля. Такие
системы кодирования с переключением получили в
дальнейшем широкое распространение в
компьютерной технике - возьмите хотя бы принцип
устройства языка HTML.
Следующим этапом было возникновение азбуки
Морзе - 1838 год. Морзе был не первым, кто придумал
двоичную кодировку алфавита в целях передачи
текстовых сообщений по электрическим цепям - еще
до него это сделал русский немец барон Шиллинг,
продемонстрировавший действующую конструкцию
телеграфа в 1828 году, однако аппарат Морзе был
устроен значительно проще и надежней, потому
именно "морзянка" используется в телеграфии
и по сей день. Следует отметить, что она не
является двоичной кодировкой в полном смысле
этого слова - в ней, кроме точки (ноль) и тире
(единица), как минимум необходимо использовать
третий знак - длинную паузу, как промежуток между
отдельными буквами. Кроме того, азбука Морзе
очень удобна для передачи комбинаций
точек-тире-пауз последовательно, но совершенно
непригодна для передачи одновременно целой
буквы - в т.н. параллельных кодах, когда код
каждого символа обязан иметь фиксированное
количество бит (например, по числу проводов в
линии). В последнем случае различить, например,
символы S, E и X не представляется возможным, так
как все они состоят из разного количества одних
только точек, и в параллельном двоичном коде
будут одинаково представлены сплошными
точками-нулями.
Самюэль Морзе (Samuel F. Morse, 1791-1872) не
был дипломированным ученым или инженером - к
моменту своего первого знакомства с действием
тока на магнитную стрелку в 1832 году (ему тогда уже
перевалило за сорок) он успел стать известным
художником, профессором живописи и даже
президентом (первым по счету) национальной
Академии художеств США. Вот ведь как бывает -
наверное, он искренне считал свои картины делом
всей своей жизни, но кто их помнит сейчас? Зато
"азбуку Морзе", несмотря на все успехи
информационных технологий, до сих пор изучают во
всех без исключения учебных заведениях,
связанных со связью, как непревзойденное по
надежности средство передачи сигналов на
расстояние - когда другие способы в условиях
сильных помех отказывают, "морзянку" все
равно можно спокойно принимать.
Предшественником современных компьютерных
кодировок принято считать коды, разработанные
еще в 1874 французом Эмилем Бодо (Emile Baudot),
усовершенствованные позднее Дональдом Мюрреем и
принятые в качестве международного стандарта в
1931 году. Официальное название кода Бодо - International
Telegraph Alphabet #2, ITA-2. Он использовался в телетайпных
аппаратах и, соответственно, в первых
компьютерах, некоторые из которых эти аппараты
использовали в качестве входных-выходных
консолей. Коды Бодо - пятибитные, поэтому
количество представленных символов ограниченно
32-мя, чего для всех необходимых символов не
хватает. Для увеличения этого числа, как и в коде
Брайля, использовались shift-переключатели. Это
неудобно - основная проблема в том, что
переключатель типа shift действует до тех пор, пока
не встретится другой переключатель, отменяющий
первый (в HTML, к примеру, каждому тегу поставлен в
соответствие закрывающий тег). Поэтому, если
какое-то сообщение заканчивается цифрой, то
начало следующего за ним текста до первого
отменяющего переключателя будет представлять
бессмысленный набор цифр вместо букв. С этим мог
сталкиваться каждый, кто пытался печатать
"красиво" на матричных принтерах, скажем, на
популярном некогда FX-800, или еще более древнем
Robotron 63291. Если некий текст
заканчивался курсивом без отмены этого режима в
конце документа, то следующая попытка что-то
распечатать приводила к тому, что документ тоже
начинался с курсива.
Кроме того, использование пятибитных кодов
неудобно для компьютерной техники - все равно
элементарная ячейка памяти занимает один байт,
то есть 8 бит (хотя так было не всегда). А восемью
битами можно закодировать 256 символов без всяких
переключателей, что уже приемлемо по крайней
мере для представления большинства европейских
языков с латинским алфавитом.
В конце 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.
1) Для простейшего управления матричными
принтерами существовала специальная система
команд IBM Proprinter (она поддерживается и принтерами
Epson, так как именно Epson поставляла первые принтеры
для IBM PC), которые позволяют осуществлять
элементарные операции с текстом и даже
манипулировать принтером в графическом режиме
при поточечной печати. Команды состоят из
символа ESC (код 27) и последующего байта,
кодирующего собственно команду. Например, коды 27
69 переключат принтер в печать жирным шрифтом, а 27
70 - отключают этот режим. Не все знают, что и
современные принтеры, скажем, лазерные, тоже
поддерживают этот набор команд.
|