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

Неполный CHARSET
Юрий Ревич

Дата публикации:  5 Мая 2003

После выхода статьи "Полный CHARSET" (никогда не знал, как правильно ссылаться на интернет-публикации с продолжением, потому привожу ссылку на третью часть, так как из нее можно прямо перейти на первую и вторую), я получил довольно много откликов, указывающих на разной степени неточности в освещении этого животрепещущего вопроса. Сразу разберемся с некоторыми мелочами. Так, Владимир Геогджаев приводит правильное объяснение того, почему кодировка КОИ-8 при очистке восьмого бита отображается на противоположный регистр соответствующего английского начертания ("Русский" в "rUSSKIJ"), - не для того, чтобы отличить английский текст от русского, как у меня написано, а потому, что при этом она правильно отображается на таблицу КОИ-7, в которой русские буквы (только заглавные) замещают по мере возможности соответствующие английские. Это легко понять, если взглянуть на соответствующие таблицы. Во-вторых, автор пользуется случаем выразить благодарность Аркадию Белоусову (aka Бильбо Ленивчатый) за указание на письмо Игоря Семенюка об истории возникновения кодировки Win1251. Я встречался с упомянутым в статье Петром Квитеком, а также Антоном Чижовым (автором, в частности, знаменитого драйвера "Beta") и Игорем Семенюком, и они подтвердили факт, упомянутый в том самом письме, - при обсуждении (происходило это около 90-91 года) вариантов для Windows про стандартизированную "основную ГОСТ" даже не вспомнили, хотя сам соответствующий вариант расположения русских букв подряд, начиная с колонки B0h, рассматривался. Семенюк даже признался, что если бы он знал про ISO и ГОСТ, то, конечно, голосовал бы за стандарт. Хотя не факт, что в "мелкомягкой" все это учли, так как никто не знает, оказало ли предложение москвичей вообще какое-либо влияние на окончательный вариант 1251 - вполне возможно, что оказало, так как русские буквы все же расположены именно так, как предлагалось. Квитек, кстати, вспоминал, что при русификации DOS "мелкомягкие" долго не уговаривались на "альтернативную", так как она не была стандартизирована, но аргумент насчет полного краха таблиц в англоязычном тексте, оформленном с помощью символов псевдографики, их все таки склонил в пользу СР866. Очевидно, после этого они там разобрались в ситуации с российскими законами и в случае Windows терять время на изучение стандартов уже не стали.

Антон Чижов и Петр Квитек, фото автораНо главное, что мне хочется исправить, - это жуткая, как оказалось, путаница с ГОСТами и - в меньшей степени - стандартами ISO, которая царит в различных источниках и оттуда невольно перекочевала в мою статью. Прежде всего ГОСТа под номером 19768-87, на который все ссылаются, очевидно, с легкой руки Романа Чиборы (в остальном создавшего прекрасный сайт про кодировки, причем имеется русский перевод вышеупомянутой страницы, посвященной кириллице), вообще не существовало в природе - был ГОСТ 19768-74 (устанавливавший кодировки КОИ-7 и КОИ-8), который впоследствии был заменен на мертворожденный ГОСТ 19768-93, вообще к нам - пользователям ПК - никакого отношения не имеющий, так как устанавливает ни с чем не совпадающие кодовые таблицы для ЕС ЭВМ, выпуск которых почти полностью к моменту создания этого ГОСТа был прекращен. Таким образом, надо понимать, КОИ-8r в настоящее время не описывается никаким ГОСТОм. Что же касается "основной" (стандарт ISO/IEC 8859-5-88) и "альтернативной" (MS DOS, СР866) кодировок ГОСТ, то на текущий момент складывается вот какая картина. ГОСТ Р 34.303-92 устанавливает обе этих кодовых таблицы, причем в основной своей части (касающейся таблицы 8859-5) он является простым переводом стандарта ISO 4873-86. Все упомянутые стандарты в совокупности с ГОСТ 27463-87 (он же ISO 646-83, устанавливавший национальные таблицы 7-битных кодов), ГОСТ 27465-87 (устанавливавший наборы русскоязычных символов) и обширного (и дорогого, надо заметить) ГОСТ 27466-87 (ISO 2022-86, устанавливавшего правила расширения кодовых таблиц) представляют собой довольно стройную систему, являющуюся ни чем иным, как альтернативой Unicode. Принцип - переключение между наборами символов с помощью ESC-последовательностей, которые в этих документах называются "последовательности АР2". Система эта не получила никакого практического применения, видимо, по двум причинам - в силу своей громоздкости и, главное, ограниченности - уже для алфавитов, включающих более, чем 256 символов, она становится настолько сложной, что двухбайтовая Unicode выглядит на ее фоне куда симпатичнее - по крайней мере, в идеале. Впрочем, что такое первый байт в таблицах Unicode, как не тот же самый переключающий символ, только действующий не до его отмены, как АР2-последовательности, подобно shift-символам Брайля, а только на один знак, как изначально было задумано для esc-кодов?

Кодовая таблица 8859-5 в упомянутом ГОСТ Р 34.303-92 носит название КОИ-8 В1 - это чтобы еще больше запутать всех. Последний же раздел этого стандарта (4-й) не переведен с ISO, а является оригинальной нашей разработкой и устанавливает как раз "альтернативную" кодировку, которая там имеется в двух вариантах, различающихся только полнотой представления символов псевдографики и носящих название "наборов однобайтовых символов" КОИ-8 Н1 и КОИ-8 Н2. Цитирую, однако, текст ГОСТа: "4.2. Наборы однобайтовых символов предназначены для применений, использующих единственный набор, включающий в себя 256 однобайтовых символов. Такие наборы предназначены для использования в персональных ЭВМ". Вот так, нас опустили. Оказывается, мы тут все только и занимаемся тем, что используем какие-то примитивные "однобайтовые наборы", в то время, как серьезные дяди в серьезном Госстандарте думают о вечности. Бог их простит...

Резюме такое - ни одна из четырех используемых ныне на практике кириллических кодировок, за исключением уходящей в прошлое вместе с DOS СР866, не отражена в существующих стандартах - по крайней мере отечественных. В ISO стандартизировали Unicode под названием ISO 10646. Буду рад, если кто-нибудь расскажет мне, что собираются предпринять в Госстандарте по этому поводу.

И в заключение, для ясности, - я не упомянул в своей статье про UTF-8. Так вот, под общим названием Unicode Transformation Format скрываются процедуры, позволяющие редуцировать двухбайтовые Unicode-символы до обычных однобайтовых, например, ASCII. Это не еще какие-то таблицы кодов, а всего лишь способы их трансформации друг в друга!