IZONE - http://www.izcity.com/ - бесплатный софт, вэб-сервисы, ресурсы для раскрутки, свежие номера журнала "Internet Zone".

 IZONE 


дНАПН ОНФЮКНБЮРЭ, или
О проблемах понимания русского языка…

Антон Орлов
stnvidnoye@chat.ru
http://stnvidnoye.chat.ru/

 

В последнее время проблемы с кодировками на страницах интернета и в письмах электронной почты утратили ту остроту, которая была присуща ей всего год-два назад; постепенно, как и должно было случиться, все переходят на единый стандарт – кодировку Windows 1251, а те немногие любители KOI-8, которые продолжают упорно слать письма и кодировать интернетные страницы в "самой правильной кодировке на свете", то ли окончательно уходят в подполье, отгородившись от мира Windows и общаясь только друг с другом, как ФИДОшники, то ли принимают иную веру, продаваясь за 30 серебрянников Биллу Гейтсу и его братству. Тем не менее, и особенно это касается популярной нынче халявной почты на сайтах типа hotmail.com или usa.net, проблема распознавания русского языка пока остается насущной, хотя наши читатели наверняка справляются с ней посредством программ-перекодировщиков, о которых мы недавно писали. А для того, чтобы не только слепо копировать тексты из почтового клиента в "Штирлица", но и немного понимать, что при этом происходит и почему вообще случилась такая путаница с кодировками (заодно, кстати, и высянить, кто при этом виноват) – прочитайте эту статью.

 

Что такое "кодовая страница"

Для записи текстовой информации в компьютерах используется кодирование символов последовательностями из восьми бит (что соответствует, как вы помните, одному байту). Один байт - один символ. Иными словами, для записи одной буквы, цифры или заковыристого значка применяется последовательность из восьми нулей и единиц. Какой же конкретно символ соответствует какой последовательности? Эти данные распознаются из так называемой "таблицы символов", которая знакома каждой программе, умеющей отображать текст.

Таблица символов (еще она называется "кодовой страницей") может храниться либо в самой программе, либо в операционной системе и предоставляться при каждом запросе. Получив последовательность из восьми бит, программа "смотрит" в таблицу символов и определяет по ней, какому символу эта последовательность бит соответствует. Нетрудно понять, что таблица символов должна быть строжайшим стандартом – ведь, если текст был написан закодирован одной таблицей символов, а пользователь читает эту последовательность в соответствии с данными другой кодовой страницы, то прочитать такой текст сможет только человек, долгие годы прослуживший в шифровальном отделе контрразведки. И для английского алфавита (латиницы) это действительно так: во всех существующих таблицах символов, использующихся в компьютерных программах, каждая латинская буква кодируется одной и только одной, твердо и строго определенной международными стандартами последовательностью бит. Такое соответствие байт и отображаемых символов было разработано почти двадцать лет назад на основе последовательности букв в латинском алфавите.

Но с помощью восьми бит можно закодировать до 256 символов - в самом деле, каждый бит может иметь значение 0 или 1, то есть одно из двух, следовательно, всего различных восьмибитовых последовательностей может быть 28=256. Английских же букв - 26, плюс еще столько же заглавных, цифры и служебные символы займут еще мест 50. Поэтому, для возможности адаптации операционных систем к другим алфавитным системам, в качестве международного стандарта было принято строгое соответствие отображаемым символам лишь первых 128 последовательностей восьми бит (от 0 по 127) - то есть первой половины кодовой страницы, а вторую половину отдали "на откуп" производителям регионального программного обеспечения и информационных ресурсов - чтобы они размещали в ней свои алфавиты.

Коды первых 128 символов кодовых страниц, которые должны быть едиными во всех таких страницах, получили название стандарта ASCII. Эти символы также могут кодироваться всего семью битами информации. Первые 32 кода (от 0 до 31) были назначены управляющим символам (например, символ с кодом 13 - это символ конца абзаца), остальные кодировали строчные и прописные латинские буквы, цифры, знаки препинания и математических операций. Коды второй половины этой 256-символьной кодовой страницы получили название "расширенного" стандарта ASCII. Ими кодировались, как уже было сказано выше, национальные алфавиты, а также символы псевдографики, математические и некоторые другие символы. Вы можете легко отобразить на экране символ с желаемым кодом, набрав, например, в Word его код (десятичный, на цифровой клавиатуре) при удерживаемой клавише Alt.

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

Российская особенность

В большинстве стран была создана одна кодовая страница для своего алфавита. Но Россия всегда шла своим путем.

Изначальные английские версии поставляемых в Россию программ не могли работать с русским алфавитом (это и понятно - в них же не было русской кодовой страницы). Поэтому была создана русская кодовая страница, получившая название ISO-8859-5, в которой кодам символов, большим 127, соответствовали русские буквы. Так как их всего 33, а с заглавными - 66, то в кодовой странице осталось место для символов псевдографики.

Другая, так называемая "альтернативная" кодировка, отличалась от ISO-8859-5 порядком следования русских букв до строчной "р", а символы псевдографики кодировались в ней теми же кодами, что и в исходной английской таблице символов. Следовательно, при принятии операционной системой этого варианта кодовой страницы можно было использовать нелокализованные версии западных программ, работающих с псевдографикой. Например, западная программа могла из символов псевдографики изобразить таблицу. Если в системе была установлена "альтернативная" кодовая страница, то символ псевдографики оказывался на нужном месте, и рисунок получался. Если же в системе стояла ISO-8859-5, то рисовалась русская буква, и внешний вид рисунка был весьма своеобразным. Поэтому, несмотря на то, что в "альтернативной" кодовой странице русские символы шли не подряд, а с разрывом между строчными буквами "п" и "р", именно она впоследствии получила наибольшее распространение. Кодовая страница ISO-8859-5 применялась при русификации компьютерных систем Sun, поставлявшихся в Россию.

Заслуга внедрения русских кодовых страниц принадлежит российской компании "Диалог" и ее ведущему программисту Петру Квитеку. В 1989 году в этой фирме-партнере Microsoft была локализована MS-DOS 4.1 - первой из всех операционных систем. При ее создании в качестве основной кодовой страницы была взята "альтернативная" кодировка, названная DOS (кодовая страница 866) - именно из-за того, что программы, использующие ее, корректно отображали символы псевдографики. Так как MS DOS стала основной операционной системой для персональных компьютеров, это привело к еще более широкому распространению данной кодовой страницы.

Windows

При создании локализованной версии операционной системы Windows фирма Microsoft решила создать собственную кодовую страницу для кириллицы. В частности, с появлением графического интерфейса отпала необходимость в использовании символов псевдографики, что позволило сделать последовательным порядок символов русского алфавита в кодовой странице, а также разместить в ней различные специальные символы вроде изображения торговой марки и др. Появилась кодировка Windows (кодовая страница 1251), которую создал тот же Петр Квитек. В ней тем символам, что в кодировке DOS (866) соответствовали одни русские буквы, были поставлены в соответствие другие символы. В результате для чтения в Windows русского текста, набранного в DOS, стали требоваться программы-перекодировщики.

KOI-8

В то время как на рынке операционных систем для персональных компьютеров безоговорочную победу одержала всем нам знакомая MS-DOS, среди операционных систем для сетей дело обстояло не так. Там начинала властвовать UNIX - операционная система, построенная на несколько других принципах. Эта система имела открытый исходный код - любой программист мог создать "свою" UNIX, настроенную именно на его предпочтения, что было очень удобно для программирования. И эта операционная система весьма бурно развивалась в сетевом отношении. Понятие кодовой страницы в UNIX имело несколько другое значение, но на этом мы сейчас останавливаться не будем.

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

Ясно, что текстовые сообщения, содержащие символы с кодами, большими 127 и не могущие быть закодированы восемью битами, нормально такими серверами обрабатываться не могли. Для того, чтобы такие письма все же как-нибудь проходили через семибитные почтовые серверы, символы сообщений принудительно приводились к семибитному виду - у них обнулялся первый бит, указывающий на половину их кодовой страницы. Например, символ "е" (русская буква е) переходил в "f", символ "ш" - в "y". Дальше шло уже обработанное таким образом письмо.

Если бы все почтовые сервера тогда были восьмибитные, то пересылка через них русскоязычной почты не составляла бы проблем – лишь бы компьютеры отправителя и получателя поддерживали бы русскую кодовую страницу. Но "обрезающие" сервера не позволяли так делать.

Выходы были. Первый, самый тогда распространенный – писать письмо транслитом, latinskimi bukvami. Некрасиво и плохо читаемо, зато надежно – дойдет в исходном виде в любом случае. Но, поскольку все же не все почтовые сервера были семибитные, была создана специальная кодировка для электронной почты, которая отличалась тем, что на места, соответствующие кодам символов, большим 127, были поставлены русские символы, похожие по звучанию на английские буквы на местах, соответствующих кодам символов, меньших на 128. Иными словами, в этой новой кодировке коды 225, 226, 227, 228 соответствовали символам "а", "б", "ц", "д", которые при семибитном преобразовании перешли бы в коды 97, 98, 99, 100, соответствующие английским буквам "a", "b", "c", "d". Слово "привет", написанное в новой кодировке, пройдя через семибитный почтовый сервер, перешло бы в слово "PRIWET", что еще хоть как-то читаемо. Ну, а если бы письму повезло, и на его пути не встретились семибитные сервера, то оно дошло бы в исходном виде.

Новая кодировка была названа KOI-8. Так как системы на основе UNIX были в основном рассчитаны на работу с электронной почтой и международными сетями, то она стала стандартом для этой системы. Количество семибитных серверов стало понемногу сокращаться, сейчас их уже почти совсем в мире не осталось, а кодировка KOI-8 так и осталась.

KOI-8 использовалась не только UNIX-системами. Так, любой пользователь персонального компьютера под управлением MS-DOS или Windows, имеющий выход к электронной почте, должен был иметь у себя программу для получения и отправки сообщений, умеющую работать с KOI-8. Выход к системе электронной почты был возможен и с компьютеров фирмы Apple - с Макинтошей, однако в операционных системах для этих компьютеров использовалась своя, оригинальная русская кодировка символов, отличающаяся от всех остальных. Для того чтобы облегчить переписку между пользователями разных типов компьютеров и операционных систем, KOI-8 была рекомендована как универсальная кодировка, и любая почтовая программа была обязана уметь читать и отправлять сообщения в ней.

Слишком умные серверы

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

Казалось бы, а в чем она могла заключаться? Главное – чтобы серверы могли обрабатывать сообщения в восьмибитных кодировках, и тогда, в какой бы кодировке сообщения ни пересылались, они всегда могли быть прочитаны принимающей стороной с помощью программы, умеющей работать с этой кодировкой. Но, увы, все оказалось не так просто… В некоторые почтовые серверы их создатели вложили возможность автоматической перекодировки поступающих сообщений – возможно, для некоей "стандартизации", чтобы все письма по Сети распространялись в одной и той же кодировке. Если на такой перекодирующий сервер поступает сообщение в кодировке Windows-1251, и он его воспринимает именно как сообщение в этой кодировке, то письмо преспокойно будет перекодировано в KOI-8 и отправлено дальше.

Кодировка письма обычно указывается отправляющей почтовой программой в заголовке сообщения или прямо в тексте письма. Однако некоторые почтовые программы могут делать ошибки - письмо написано, например, в KOI-8, а программа пишет в заголовке письма, в служебной информации, что письмо имеет кодировку Windows-1251. Если такое письмо будет отправлено адресату, то оно сразу не сможет правильно отобразиться в его почтовой программе - на экране будет мешанина символов. Поскольку почти все почтовые программы позволяют просматривать одно и то же письмо в различных кодировках, то получатель письмо прочитать все же сможет, просто выбрав для него правильную кодировку.

Но если такое письмо – с несоответствующим содержанию заголовком – попадет на перекодирующий почтовый сервер, то ситуация резко осложнится. Посмотрев на заголовок письма, сервер решит, что раз оно написано в Windows-1251, как там указано, то оно должно быть перекодировано в стандартную для Сети (по мнению сервера и его создателей) кодировку KOI-8. К письму будет применено преобразование из Windows-1251 в KOI-8: будут заменены соответствующие коды символов. Но письмо-то уже изначально было в KOI-8! И что получается? Автор письма написал в нем "Добро пожаловать". В KOI-8 оно перекодировалось как "дНАПН ОНФЮКНБЮРЭ". А сервер эту фразу снова перекодировал по тем же законам, что и любая перекодировка из Windows-1251 в KOI-8. И получилось: "Дмюом нмтчймачпщ". Понять что-либо стало невозможно. Ну а если на пути письма попалось несколько перекодирующих почтовых серверов и оно было перекодировано не один раз, то дешифровка такого письма становится крайне сложной задачей.

Вложенные файлы

Изначально система электронной почты предназначалась для обмена исключительно текстовыми сообщениями и не могла пересылать вложенные файлы, которые обычно являлись архивами и представляли собой двоичные данные, то есть не раскладывались на вразумительную последовательность символов. Безусловно, можно было принудительно разбить последовательность бит в файле на группы из восьми бит и попытаться перевести его в текст (эксперимент может проделать каждый, переименовав какой-либо исполняемый файл или архив в файл с расширением ".txt" и загрузив его в Microsoft Word 97 или Microsoft Word 6.0), но в этом случае в таком тексте было бы большое количество символов с кодами меньше 33 и больше 127, из которых со вторыми могла бы возникнуть проблема обрезания старшего бита в семибитных почтовых серверах, описанная выше, а первые могли очень своеобразно отобразиться в почтовой программе. Кроме того, символы с кодами, большими 127, имели шанс подвергнуться перекодировке в российских почтовых серверах.

Ясно, что после подобных преобразований пересылаемая программа вряд ли заработала бы, а архив открылся - их код стал бы практически невосстановимо испорченным. Поэтому были разработаны специальные системы вложений двоичных файлов в почтовые сообщения, основанные на конвертации двоичных данных в набор символов с кодами от 33 до 127, могущий быть впоследствии подвергнутым обратному преобразованию в исходные двоичные данные. Систем такой конвертации было разработано несколько, самые употребительные из них – UUEncode и base64. Почтовая программа, умеющая работать с такими вложениями, конвертировала перед отправкой письма вложенные файлы в одну из таких кодировочных систем, помещая перед вложением соответствующее указание на такую конвертацию, а при получении письма с вложениями просматривала текст письма и при нахождении вставки фрагмента, закодированного как, например, UUEncode или base64 (что определялось по специальному указателю в тексте письма), превращала этот фрагмент в исходный двоичный файл. Сейчас все общеупотребительные почтовые программы умеют это делать.

Для иллюстрации вышеизложенного можно посмотреть в любой почтовой программе исходный текст письма с вложением (в Microsoft Oultook Express это делается с помощью контекстного меню иконки письма: Свойства > Подробности > Исходное сообщение). Просмотрев текст, можно увидеть указания на название файла, например архив ZIP с названием archive.zip, и способ конвертации вложения, например base64, а также текст архива, конвертированный в набор символов первой половины кодовой таблицы. Outlook Express при получении такого письма распознает наличие вставки base64, отобразит вложенный файл на панели вложений и позволит сохранить его на жесткий диск или прочитать, подвергнув обратному преобразованию из base64.

Quoted-printable

Можно задуматься: а если с помощью преобразования символов первой половины кодовой страницы по определенному алгоритму можно пересылать по электронной почте двоичные файлы, то почему бы не делать точно так же и с самими сообщениями? Ну и что, что размер сообщений вырастет – разница в несколько килобайт здесь особой роли не играет. И действительно, такой способ кодирования текстов реализован, - были созданы так называемые семибитные кодовые таблицы (собственно название несколько некорректное, но так уж повелось). В них каждый символ исходного текста кодируется тремя буквенными или цифровыми символами. Еа настоящий момент существуют две разновидности семибитных кодировок, различающиеся символом-разделителем букв. Текст, закодированный с помощью такой кодировки, выглядит как =C2=EE=F2 или %C2%EE%F2. Кодировка, в которой символом, разделяющим коды отдельных букв исходного текста, служит знак "=", называется Quoted-printable и сейчас используется очень широко. В частности, почти все сообщения Microsoft Outlook Express, посылаемые в HTML-формате, отправляются именно в такой кодировке.

Существуют также специальные кодировки для написания текста на нескольких языках сразу – UTF-7 и UTF-8, принцип которых такой же - конвертация исходного текста в текст из символов первой половины кодовой страницы, но их рассмотрение выходит за рамки данной статьи.

Unicode

В ранних версиях Windows для каждой кодовой страницы должен был иметься свой шрифт, так как в один шрифтовой файл - в одну кодовую страницу - нельзя было поместить больше 255 символов. Это имело определенные неудобства, и был придуман и утвержден новый стандарт таблицы символов - Unicode. Согласно этому стандарту, каждый символ кодировался не восемью, а шестнадцатью битами информации, что позволяло закодировать до 65536 символов. Эта кодировка также получила название двухбайтовой кодировки. Для совместимости со старыми стандартами первые 256 символов стандарта Unicode соответствовали стандартной кодовой таблице, а на остальных местах можно было разместить все необходимые символы всех языков. Соответственно, были созданы новые шрифты в стандарте Unicode.

В Unicode-шрифте имеются как бы несколько кодовых страниц сразу. Программа, работающая с таким шрифтом, использует символы нужной ей кодовой страницы. Для того, чтобы программы, не поддерживающие стандарт Unicode (например, Microsoft Word 6.0), могли работать с такими шрифтами, операционная система осуществляет так называемую "подстановку шрифтов", то есть "раскладывает" шрифт Unicode на отдельные кодовые страницы и выбирает из них ту страницу, которая соответствует установленной в системе. Параметры подстановки прописываются в системном реестре и в файле win.ini. Смысл находящихся в этом файле выражений – указание программам на то, где в шрифтовом файле искать символы, соответствующие нужной кодовой странице. Так, для шрифта Times New Roman эти символы (кириллица) начинаются с 204-го места, что и указано в win.ini. Теперь Microsoft Word 6.0 спокойно будет работать с Unicode-шрифтом Times New Roman, воспринимая его как обычный кириллический шрифт. При этом в восприятии Word 6.0 шрифт Times New Roman окажется как бы "разложенным" на набор шрифтов (Times New Roman Cyr, Times New Roman CE и др.), каждый из которых будет соответствовать определенной кодовой странице, несмотря на то, что все эти шрифты хранятся в одном файле.

Иногда встречается ситуация, когда Microsoft Word 97 вполне нормально отображает текст на экране, но на принтер выводится набор квадратиков. Это вот как раз проявляется некорректное взаимодействие программного обеспечения, когда одни компоненты (Word 97) поддерживают новый стандарт, а другие - нет. (Пути преодоления этой проблемы таковы: либо установить новые драйвера к принтеру, либо в системном реестре, в разделе "HKEY_CURRENT_USER\Software\Microsoft\Office\8.0\Word\<имя принтера>" создать новую строковую переменную "Flags" со значением "8192", либо в системном реестре, в разделе "Font Substitution" для всех русских шрифтов, при печати которых выводятся квадратики, надо написать: Font,0=Font,204 и Font,204=Font,204. То же самое надо поместить и в win.ini.)

Источник: http://upgrade.computery.ru/

 


Copyright © "Internet Zone"info@izcity.com
Копирование и использование данных материалов разрешается только в случае указания на журнал "Internet Zone", как на источник получения информации. При этом во всех ссылках обязательно явное указание адреса вэб-сайта http://www.izcity.com/. При наличии у копируемого материала авторов и источника информации - их также нужно указывать, наряду со ссылкой на нас.