Язык — один, кодировки — разные, или Проблемы буквы «ґ»

9 июль, 1998 - 14:22Федор Зима

Почему так сложилось, что мы для одного и того же языка используем разные кодировки символов? Неужели нельзя договориться между собой, чтобы раз и навсегда с экранов компьютера исчезли сообщения типа «эхяЁрт-шы№эр ъюфшЁютър» или «МЕ-ОПЮБХКЭМЮЪ ЙНДХПНБИЮ»? Жизнь показывает, что это сделать весьма непросто, и, к сожалению, придется смириться!

Самое интересное, что распространенные у нас кодировки 866 (русский MS-DOS) и 1251 (русский Windows) не являются государственными стандартами, где бы то ни было. А вот международные стандарты ISO, не говоря уже об украинском ГОСТ’е, никто особенно не жалует. Все правильно, ведь стандарты разрабатывают одни специалисты, а программы пишут другие.

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

Одна только Microsoft умудрилась создать две таблицы — 866 и 1251, полностью несовместимые между собой. В 866 не было места для специальных символов кириллицы (в том числе и для недавно возвращенной в украинский язык буквы «ґ»), поскольку много места занимала псевдографика Зато в 1251 — чего только нет! Правда, кириллицу в ней зачем-то передвинули на другое место. Этот, казалось бы, малозначительный факт на пару лет сдержал широкое распространение Windows на территории всего бывшего СССР.

БИЛЛ ГЕЙТС И УКРАИНСКИЙ ВОПРОС

Какой бы простой ни казалась кодировка 866, для тех, кто всерьез работает с украинским языком, она просто неприемлема. Далеко не самой серьезной здесь является проблема буквы «ґ» (она же «г твердое»). Важнее другое — отсутствует украинская буква «i». По замыслу авторов кодировки, вместо нее нужно применять латинскую. Но тогда почему бы не применять, скажем, латинскую «А» вместо ее прототипа в кириллице? Этот подход практиковался в эпоху больших ЭВМ и полностью себя дискредитировал Допустим, нужно отсортировать ряд слов по алфавиту. Но тогда возникает вопрос: из каких букв они состоят — из латинских или украинских, идентичных по начертанию? А что, если наши слова перемешаны с иностранными, скажем, в списке названий кораблей, которые в данный момент находятся в порту7 Традиционно латинские слова должны быть в начале, поэтому непонятно, какое название будет первым — авианосец «Nimitz» или крейсер «Аврора».

Таким образом, в 866-й кодовой таблице при алфавитной сортировке латинские и украинские слова, начинающиеся с «i», склеиваются в один блок. Более того, они будут расположены перед названиями на букву «А». Разумеется, что для правильной сортировки украинских названий нужно пользоваться так называемой collate sequence — дополнительной кодировкой, которая позволяет задать алфавитный порядок для соответствующего языка. Несколько языков с одинаковыми или похожими алфавитами (как это имеет место для русского, украинского и белорусского) могут использовать одну и ту же кодировку, но collate sequence у них разные. Такая collate sequence есть в Windows 95 и NT для любого поддерживаемого языка, в том числе и для украинского. Но в том-то и дело, что там буква «i» трактуется только как латинская и оказывается раньше, чем «А»! Таким образом, поддержка украинского языка есть, но реализована она некорректно.

Но самое интересное начинается, когда происходит конвертация текста из одной кодировки в другую. Например, мы даем украинское название файлу, в котором есть буква «i», скажем ХЛІБ.DOC, в какой-нибудь Windows-программе. После этого с данным файлом бесполезно работать в сеансе MS-DOS, ведь там его имя будет преобразовываться из Windows-кодировки в кодировку 866. Как же в этом случае представить букву «i»? Если как латинскую, то тогда может возникнуть путаница с другим файлом, где на этом месте действительно латинская буква. В Microsoft приняли соломоново решение — вообще ее не преобразовывать, т.е., просматривая содержимое каталога с помощью команды DIR, мы увидим вместо этой буквы знак подчеркивания, соответствующий всем символам, которые не удалось преобразовать.

Можно сколько угодно писать вышеуказанное имя файла в командах COPY, DEL или RENAME -ответ будет один «Файл ненайден». В сеансе MS-DOS откажутся работать с такими файлами и всевозможные командные оболочки под DOS, будь они хоть сто раз русифицированными и приученными к работе с именами файлов в кириллице.

Что же касается «ґ», то политика Microsoft по отношению к ней заслуживает особого внимания. Кодировка 866 ее не содержит, поскольку она разрабатывалась в расчете на потребности СССР. Однако в кодировке 1251, которая используется в Windows, она предусмотрена — наверняка представители украинской диаспоры в одной только Канаде купили больше лицензионных копий Windows З.х/95/NT и т.п., чем пользователи всей Украины. Кстати, вероятно, их оказалось все же недостаточно, чтобы создать и поддерживать украиноязычный Windows.

Но вернемся к букве «ґ». На сегодняшний день это — полноценная буква украинского алфавита, занимающая свое место в алфавите рядом с обычным «г». В Windows 95 все по-другому — эту букву трактуют как необязательную замену «г», и, соответственно, при сортировке они не различаются (в русском языке это имеет место в отношении «е» и «ё»), В Windows NT 4.0 буква «ґ» уже отличается при сортировке от «г», но их зачем-то поменяли местами.

Таким образом, совершенно ясно, что в официальную комиссию по вопросам правописания, которая в Украине существует довольно давно, никто не додумался обратиться. Правда, на это не стоит обижаться Для того чтобы страна, помимо политической, была нанесена также на экономическую карту мира, в ней должны свободно принимать к обмену доллары, изучить английский язык, открыть сто «Макдональдсов» и купить несколько сотен тысяч копий Windows. До выполнения всех условий осталось не так уж и много, так что подождем.

В ГОСТЯХ У ГОСТ’А

Я не встречал ни одного человека из числа IT-специалистов, который был бы доволен украинским ГОСТ’ом на кодировку символов. С распадом СССР употребление украинского языка при компьютерном наборе быстро возросло, и многие программисты бросились писать новые драй веры экрана, клавиатуры и принтера. Почти все они слышали о букве «г» и проблемах с буквой «i», и каждый реализовывал свою уникальную и неповторимую раскладку. И вот, когда все было уже написано, установлено на тысячи компьютеров, когда на винчестерах хранились сотни мегабайтов набранных файлов, вышел этот судьбоносный стандарт Программисты, произнеся несколько фраз, приводить которые не стоит в рамках этого издания, тут же начали писать программы перекодировки.

Украинский ГОСТ решал проблемы «ґ» и «i», но при этом они оказались размещены поверх других украинских символов кодировки 866. Досталось и белорусской «ў» - с ней поступили так же, как и с «союзом трех братских народов» Совместимость приказала долго жить. Когда решение еще было на стадии обсуждения, мне хорошо запомнилась фраза известного киевского программиста Безрукова: «866 кодировка — это политика, а все остальное — интриги». Однако, что сделано — то сделано. К счастью, эта кодировка не была суперреволюционной. Совместимость со всеми символами русского алфавита сохранилась (даже никем не используемая буква «ё» осталась на своем месте). А ведь всерьез прорабатывался вариант кодировки, которая сходу решила бы проблемы сортировки украинского алфавита, расположив буквы в нужном порядке. Правда, русские тексты в такой кодировке читать было бы уже нельзя. Так что принятый ГОСТ был довольно лояльным (кое-кто усмотрел в этом «руку Москвы»).

По прошествии времени следует признать, что кодировка ГОСТ не только имеет право на существование, но и является более предпочтительной, чем 866. Дело в том, что проблему буквы «I» так или иначе пришлось бы решать Допустим, она была бы введена в кодировку 866 на какое-нибудь свободное место, но ведь все равно совместимость сохранялась бы только в одну сторону -старые тексты на «новых» компьютерах (т. е. компьютерах с новым драйвером) читались бы, а новые тексты на «старых» — нет.

Таким образом, главным недостатком кодовой таблицы символов ГОСТ’а было то, что его слишком поздно приняли. Но, в конечном итоге, эта кодировка получила некоторое распространение в госучреждениях и даже в коммерческих организациях Поэтому, если уж решать проблемы кодировки 866 с помощью переделок файлов настройки системы, то лучше всего это делать, перейдя на ГОСТ, — все-таки стандарт. Все базы данных по законодательству работают именно в этой кодировке, в ней же поставляются многие компьютерные адресно-телефонные справочники К счастью, Windows 95, Windows NT и OS/2 можно полноценно настроить на украинский ГОСТ в качестве дополнительной кодировки, если только вас не пугает использование шестнадцатеричного редактора.

КОИ-8 — ДОДУМАЮТСЯ ЖЕ ДО ТАК0Г0!

Известно, что Internet в лице своей бывшей советской части Relcom в качестве стандартной кодировки имеет КОИ 8. Это -одна из самых причудливых кодировок и единственная из рассматриваемых, которая абсолютно непригодна для отображения украинских текстов. Правда, существует вариант кодировки КОИ-8У с поддержкой необходимых букв, но принципиально она ничем не отличается от других таблиц символов — поддержки для них в среде Internet нет. Дело в том, что многие почтовые программы настроены на передачу текстов именно в кодировке КОИ-8.

Однако КОИ-8 практически нигде, кроме устаревших больших ЭВМ, не используется для отображения символов на экране, т е. письмо, приходящее по электронной почте в КОИ-8, подвергается затем обязательной автоматической перекодировке. И, наоборот, исходящее письмо конвертируется в КОИ-8 перед отправкой. Вот почему даже наличие украинских букв в кодировке компьютера ни на йоту не приближает пользователя к возможности посылать украиноязычные послания. Украинские символы будут в лучшем случае сконвертированы в пробелы,а в худшем — останутся неперекодированными и совпадут с другими буквами в кодировке КОИ-8. Человек, получивший такое письмо, не сможет восстановить их, даже воспользовавшись специальной программой. Более того, если ему нужен точный текст этого письма (например, чтобы его процитировать), получатель вынужден будет вручную его исправлять.

В свое время в кодовой таблице КОИ-8 латинским буквам и некоторым спецсимволам поставили соответственно по фонетическому признаку буквы кириллицы.

Кстати, символы кириллицы в КОИ-8 имеют коды во второй половине таблицы, но если отнять от них 128 (что соответствует установке старшего бита в 0), то как раз и получатся приведенные в первой строчке таблицы латинские символы. Когда-то к Internet были подключены компьютеры, имеющие 7 битов в байте, и для связи с ними старший бит необходимо устанавливать в 0. Неизвестно, сохранились ли они до нынешних времен, но весьма многие хосты Internet все еще работают в семибитовом режиме.

Таким образом, КОИ-8 обеспечивает весьма надежную передачу. Тот, кто примет послание, в котором старший бит был установлен в 0, все равно сможет его прочитать без помощи дополнительного программного обеспечения. Ведь большинство латинских символов здесь имеют легко запоминающиеся фонетические эквиваленты в кириллице, а остальные легко можно понять из контекста. Zdrawstwujte, q wa[a tetq! — все понятно, не правда ли?

КОИ-8 применяется в среде Internet и нигде больше, поэтому к ней нет никаких особых требований, вроде сортировки по алфавиту. Тем не менее, именно ее лучше использовать при рассылке электронных писем, особенно нескольким адресатам сразу. Практика показывает, что это даже намного лучше, чем прикрепленные с помощью MIME или UUENCODE файлы. Некоторые абоненты пользуются столь «пещерными» программами электронной почты, что не в состоянии прочитать сообщение, а если и в состоянии, то для этого придется сделать несколько дополнительных действий.

КТО ЗДЕСЬ ОСНОВНОЙ?

Многие еще помнят чудо-компьютеры «Нейрон» и им подобные, созданные отечественным производителем (кстати, они продавались по цене 20 тыс. тогда еще не до конца «одеревеневших» рублей). Единственным их преимуществом было отсутствие необходимости в драйверах клавиатуры и экрана (по тогдашним скромным потребностям это считалось едва ли не вопросом № 1: решил эту проблему, и все остальное уже не важно). Однако они работали с так называемой «основной» кодировкой, в которой символы псевдографики были расположены не на тех местах, где во всем остальном мире, поэтому большинство программ вместо псевдографики выдавали русские буквы.

Это почему-то не считалось проблемой. Группа программистов (а по сути, хакеров) при АН СССР адаптировала капиталистические программы к социалистической действительности. Адаптация, в основном, заключалась в русификации программ (разумеется, в нужной кодировке) и смене названия (ORACLE — КАРС, FoxBase+ — КАРАТ-М, dBASE — Микро PC и т.п.). Однако программное обеспечение появлялось слишком быстро, и его хотелось иметь сразу, не дожидаясь, пока его «угонят, перекрасят и перебьют номера на двигателе». Кроме того, такое ПО хотелось использовать на хороших компьютерах, а не на медленных и ненадежных отечественных ПЭВМ. Поэтому вскоре была разработана «альтернативная» кодировка, у которой псевдографика совпадает с кодовой таблицей 866 и которая, на самом деле, и стала основной.

Однако «основная» кодировка не исчезла совсем и с успехом может использоваться, скажем, во многих версиях Unix. Это потому, что в свое время ее благоразумно стандартизировали. Стандарт затем вошел составной частью в стандарт ISO-8859 (точнее, ISO-8859-5). Вошел, правда, в слегка измененном виде — псевдографика там была уже не нужна, поскольку этот стандарт ориентируется исключительно на кодировку символов алфавита. На освободившееся место попали дополнительные символы кириллицы. Нашлось место и для украинских букв, вот только многострадальной буквы «Г» там нет. Сегодня все современные броузеры и программы электронной почты распознают эту кодировку, и иногда это оказывается полезным, поскольку письма, закодированные в ISO-8859-5, все еще пишут.

UNICODE — АТОМНАЯ БОМБА С ДВОЙНЫМ ЗАРЯДОМ

Поскольку человечество мечется туда-сюда между разными кодировками, его захотели осчастливить раз и навсегда. Для этого решили разработать кодировку, которая устраивала бы буквально каждого, а для этого нужно, чтобы в ней были абсолютно все символы всех алфавитов. Разумеется, для этого одним байтом, принимающим 256 значений, не обойтись. Необходимо 2 байта.

Подобные попытки предпринимались и раньше. Скажем, редактор WordPerfect в свое время имел двухбайтовую кодировку, где один байт отвечал за номер кодовой таблицы, а другой — был кодом в этой таблице. Таким образом, несколько кодовых таблиц для разных алфавитов «сшивались» в одну кодировку. Несмотря на то что WordPerfect был весьма распространен, эта кодировка не стала стандартной (да никто, собственно, и не собирался ее продвигать в массы).

Двухбайтовая же кодировка UNICODE была поддержана многими производителями ПО и зафиксирована как стандарт. Это имело ряд последствий. Во-первых, одной кодировкой стало больше. Во-вторых, однобайтовые символы заменили двухбайтовыми, и размер программ, и особенно файлов данных, заметно вырос. В-третьих, переход на UNICODE для шрифтов и файлов настройки действительно дал некоторый положительный эффект.

Увеличение размеров файлов -это, однозначно, плохо, и убедительных оправданий этому нет. Разумеется, жесткие диски сегодня становятся дешевле и вместительнее, но пространство на них все еще не является бесплатным. Если уже и разрабатывать некую универсальную кодировку, то гораздо ближе к воплощению этой идеи были разработчики фирмы IBM. Они предложили BINCODE смешанную однобайтово-двухбайтовую кодировку. Символы из первой части кодовой таблицы (весьма употребительные, поскольку, кроме латиницы, там находятся цифры и знаки препинания) кодируются по-старому — одним байтом, а если значение байта превышает 127, то в расчет берется также второй байт, и вместе они могут закодировать почти 33 тыс. символов. При этом все англоязычные программы и утилиты сохраняются без изменений, и размер файлов данных возрастает не так сильно. Однако сегодня у BINCODE уже нет шансов на всеобщее признание.

Начиная с Office 97, Microsoft перешла от поддержки UNICODE только на уровне системы к ее поддержке на уровне прикладных программ. Теперь все файлы, создаваемые в Word или Excel, заметно «поправились». Но самое главное, при загрузке файлов, созданных в старых версиях пакетов, перекодировка происходит согласно кодовой таблице для Западной Европы, т. е. кириллица по умолчанию преобразуется в западноевропейские каракули, если только использовать для нее шрифт, совместимый с UNICODE.

Если же применять для этого текста старый шрифт, совместимый с кодировкой 1251, то смотреть на текст можно. Но только смотреть! Попробуйте внести в него правки — коды клавиатуры тоже преобразуются в UNICODE, а это значит, что в старом шрифте вы увидите пустые квадраты вместо букв, а в новом будет все нормально. Фактически текст будет набран в двух разных кодировках, и пользователь может этого даже не заметить. Достаточно затем установить единый шрифт для всего текста, и проблемы не заставят себя ждать. А если текст перенести на другой компьютер, на котором имеются не все нужные шрифты, может начаться настоящий скандал. Ведь теперь проблему не решишь заменой одного шрифта на другой...

Единственный положительный аспект внедрения UNICODE — это технология поддержки кодовых таблиц (866, 1251 и т. п.), когда таблицы перекодировки из одной в другую не задаются напрямик, а реализуются через UNICODE. Например, при переходе от 866 к 1251 сначала происходит перекодировка из 866 в UNICODE, а затем из UNICODE в 1251. Это позволяет сэкономить на количестве перекодировочных таблиц, ведь их теперь не нужно строить по принципу «каждый с каждым», а лишь, как «каждый с UNICODE». Особенно ощутим выигрыш для консольных приложений, которые отображаются в окне. В Windows NT для этого используется шрифт Lucida Console, являющийся шрифтом UNICODE. Теперь для изменений в кодировке 866 нужно всего лишь заменить файл, отвечающий за перекодировку из 866 в UNICODE. Файл шрифта вообще не нужно трогать.

Однако распространение UNICODE означает окончательную «смерть» приложений, работающих в алфавитно-цифровом режиме монитора, поскольку они не смогут поддерживать UNICODE -там можно запрограммировать знакогенератор максимум на 256 символов (в некоторых видеорежимах — 512).

При этом никто не задумывается, сколько вообще нужно символов? UNICODE предоставляет фантастические возможности. Например, вы можете написать другу письмо на русском или украинском языке, «пересыпая» его цитатами из книг немецких и французских авторов (со всевозможными умляутами и пр.). В конце письма можно написать «Банзай!» японскими иероглифами и «Аллах Акбар!» арабской вязью. Но зачем?! Даже в некоторых специфических областях применения компьютеров, таких, как составление словарей, где, помимо символов двух алфавитов, используются также символы транскрипции, разработаны кодировки, содержащие 256 символов.

Что же касается Internet, то и HTML, и MIME позволяют создавать документы, состоящие из нескольких частей. В каждой части может быть свой параметр charset, идентифицирующий кодировку, в которой набран текст. Так что для желающих неожиданно перейти с русского на китайский внутри документа такая возможность имеется.

И все-таки сегодня решать проблемы с кодировкой необходимо. По крайней мере, стремиться к этому. Создать единый международный язык с четкой, логичной грамматикой и тем самым раз и навсегда устранить вопросы написания слов люди пытаются давно. Еще в прошлом столетии Джоан Мартин Шлейер (Johann Martin Schleyer), католический священник из Бадена, предложил универсальный алфавит, подходящий для всех языков под названием Volapjuk (фонетика слова проста: «vol» — от англ, слова «world», «рjuк» — от «speech»), который, кстати, стал предшественником Esperanto. Кодировка Volapjuk в Internet довольно популярна. Но, тем не менее, читать знакомые по букварю слова, написанные латинскими буквами, несколько непривычно. И, тем более, неохота отказываться ради таких сомнительных удобств от правописания на родном языке. Поэтому попытки ведущих производителей программного обеспечения угодить всем и навести какой-то порядок в вопросах национальных кодировок нужно, скорее всего, только приветствовать.