Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
БЕКИН_Д_ЖЕНАТОВ.doc
Скачиваний:
35
Добавлен:
24.08.2019
Размер:
4.5 Mб
Скачать

6.3. Стандарты кодирования символов ansi, кои-8 и unicode

Известно несколько вариантов кодирования символов IBM, которые называются «кодовые страницы» (code pages). Вариант, используемый в Соединенных Штатах Америки и большинстве европейских стран, называется Code Page 437. В системах, используемых в Норвегии, Дании, Португалии и некоторых других странах Европы, используются другие специальные кодовые страницы, в которых содержится большее количество специальных символов, необходимых для языков этих стран. В последнее время некоторые из этих стран начали использовать кодовую страницу Code Page 850, в которой содержится меньшее количество псевдографических символов. За этот счет добавлены дополнительные символы, знаки ударения и других специальных символов.

Расширенный набор символов, который Windows и программы для Windows в большинстве случаев используют, называется “набор символов ANSI(ANSI character set), и фактически он является международным стандартом ISO.

В нашей стране кодовые комбинации, начиная с 128, используются для кодирования символов кириллицы, математических символов и др. информации. Причем для каждой платформы используется свое расположение символов в кодовой таблице. Так известны кодировки Windows, Mac, DOS-OS/2, ISO (Dec) и КОИ-8. Поэтому приходится осуществлять перекодировки символов кириллицы электронных изданий в зависимости от используемой платформы. Хронологически одним из первых стандартов кодирования русских букв на компьютерах был КОИ8 ("Код обмена информацией, 8-битный"). Эта кодировка применялась еще в доисторические советские времена на компьютерах серии ЕС ЭВМ, и когда в середине 80-х появились первые русифицированные версии операционной системы UNIX, они переняли эту кодировку у своих "старших братьев". Сеть РЕЛКОМ, с которой начинался российский Интернет в начале 90-х и которая поначалу состояла в основном из компьютеров с UNIX, также приняла кодировку КОИ8 в качестве стандартной. В результате сейчас КОИ8 является единственно допустимой кодировкой в русскоязычной электронной почте и телеконференциях и одной из кодировок, которые обязательно должна поддерживать любая русская страница в WWW. Справедливости ради, следует отметить, что существуют «Основная кодировка ГОСТа», «Альтернативная кодировка ГОСТа» и кодировка КОИ-8. В последнем случае символы кириллицы имеют коды: А Я – 224 –254 (не в алфавитном порядке); а-я – 192-223 (не в алфавитном порядке).

По мнению специалистов «Альтернативные кодировки ГОСТа» используют под кодировки символов кириллицы позиции, где в кодировке IBM расположены относительно редко используемые символы национальных алфавитов, греческие буквы и некоторые математические символы.

Стандарт Unicode был предложен некоммерческой организацией Unicode Consortium, образованной в 1991 г. В отличие от всех остальных кодировок, Unicode отводит на каждый символ не один байт, а два, и потому с его помощью можно закодировать не 256 символов, а целых 65536. ем самым обеспечивается информационная совместимость данного способа кодирования со стандартом ASKII.

Двухбайтовое описание кодов символов позволяет закодировать очень большое число символов из различных письменностей. Так, в документах Unicode могут соседствовать русские, латинские, греческие буквы, китайские иероглифы и математические символы. Кодовое пространство Unicode разделено на несколько областей. Область с кодами от 0000 до 007F содержит символы набора Latin 1 (младшие байты соответствуют кодировке ISO 8859-1). Далее идут области, в которых расположены знаки различных письменностей, а также знаки пунктуации и технические символы. Часть кодов зарезервирована для использования в будущем (29000). 6000 кодовых комбинаций оставлено программистам. Символам кириллицы выделены коды в диапазоне от 0400 до 0451. Полная спецификация стандарта Unicode представляет собой довольно толстую книгу и включает в себя все существующие, вымершие и искусственно созданные алфавиты мира, а также множество математических, музыкальных, химических и прочих символов. Пока что Unicode имеет весьма ограниченное распространение, но есть надежда, что для русского языка он со временем сможет потеснить (если не совсем вытеснить) все остальные кодировки. В частности, Unicode встроен в язык программирования Java, который, судя по всему, будет лежать в фундаменте сетевых приложений и операционных систем будущего.

Вторая по значению в русском Интернете (и, безусловно, первая по употребимости на персональных компьютерах) кодировка - это стандартная кириллическая кодировка Microsoft Windows, обозначаемая сокращением CP1251 ("CP" означает "Code Page", "кодовая страница"). Все Windows-приложения, работающие с русским языком, обязаны понимать эту кодировку без перевода. Благодаря распространенности Windows кодировка CP1251, вместе с КОИ8, входит в абсолютный минимум кодировок, которые должна поддерживать любая русская WWW-страница.

Реликтом эпохи повсеместного господства MS DOS остается так называемая "альтернативная" кодировка, в терминологии фирмы Microsoft - кодировка CP866. И хотя путешествовать по WWW на компьютере с MS DOS - занятие не из самых увлекательных, кодировка эта сохраняет определенный авторитет благодаря тому, что она принята в качестве стандартной в операционной системе OS/2 и в некоммерческой сети ФИДО. Поэтому изредка в WWW можно встретить страницы, предлагающие посетителям в качестве одного из вариантов альтернативную кодировку MS DOS.

Однако первой фирмой, выпустившей русифицированную операционную систему, была все-таки не Microsoft, а Apple. И разумеется, русифицированные Макинтоши, появившиеся в конце 80-х, имели свою собственную, ни с чем не совместимую кодировку кириллицы. Хотя в нашей стране компьютеры этой марки так и не приобрели популярности, сравнимой с их популярностью на Западе, в WWW можно встретить и кириллическую кодировку для Макинтошей.

Международная организация по стандартизации (International Standards Organization, ISO) утвердила в качестве стандарта для русского языка еще одну кодировку под названием ISO 8859-5. К сожалению (или к счастью?), эта кодировка была принята лишь в очень ограниченном количестве программных и аппаратных продуктов (в основном тех, которые русифицировались на западе людьми, незнакомыми с реальным положением дел в компьютерной кириллице). В результате ISO 8859-5 в Интернете - да и вообще в компьютерном мире - встречается крайне редко.

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

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

Помимо соображений конкуренции изобретателями кодировок в первую очередь двигал чисто практический расчет. Как правило, еще до того как операционная система русифицируется, за символами из верхней половины таблицы ASCII (с кодами от 128 до 255) уже закреплено то или иное употребление, и чтобы разместить в этом же диапазоне кириллический алфавит, приходится чем-то жертвовать. Разумеется, наименее ценные кодовые позиции, замещение которых нанесет наименьший ущерб функциональности системы, в каждом случае свои, и чаще всего необходимые для полного набора кириллицы 66 знакомест (включая букву "ё", которая традиционно выносится за пределы основного алфавита) не удается расположить подряд. Этим и объясняется тот факт, что ни в одной из кодировок, кроме ISO 8859-5 и Unicode, русские буквы не идут сплошным блоком. В некоторых кодировках допускаются даже отклонения от алфавитного порядка - в особенности в КОИ8, расположение русских букв, в которой определяется, как это ни смешно, алфавитом тех латинских букв, которые на клавиатурах советского производства располагались на одних клавишах с соответствующими буквами кириллицы (например, буква "Ю" стояла на одной клавише с символом "@", идущим в ASCII перед латинской "A", и потому стала в КОИ8 "первой буквой алфавита"). Интернет немыслим без интенсивного обмена информацией между разными компьютерами - и в том числе (и даже в первую очередь) информацией текстовой. Поэтому проблема кодировок приобрела в последнее время особую остроту. Идеальным был бы вариант, при котором вся информация проходила бы по сети в одной стандартной сетевой кодировке, а на входе и выходе каждого компьютера, включенного в сеть, стояли бы перекодировщики, незаметно для пользователя преобразующие поток данных из сетевой кодировки в локальную кодировку данного компьютера (которая при этом может быть какой угодно) и обратно.

До некоторой степени этот идеал реализован только в системах электронной почты и телеконференций русскоязычного Интернета, где действительно существует стандартная сетевая кодировка КОИ8 и где программы-клиенты, отправляющие и получающие почту, перекодируют ее перед отправкой и после приема.

Однако в последнее время, когда все больше пользователей переходят на прямое IP-подключение к Интернету и осваивают обмен почтой по протоколам SMTP и POP, на сцену выходит множество новых почтовых программ, нередко нерусифицированных и не имеющих никакого представления о необходимости перекодировать отправляемую. В большинстве случаев этот недостаток почтовых программ можно восполнить, установив на компьютер клавиатурный драйвер и шрифты в кодировке КОИ8. К сожалению, множество пользователей либо вообще не подозревают о необходимости такой дополнительной настройки, либо не знают, с чего ее начать и как довести до успешного конца. В результате электронная почта и особенно телеконференции заполонены сейчас письмами в "чужих" кодировках.

Более современные русифицированные почтовые программы, не только следуют стандарту, перекодируя отправляемую почту, но и позволяют читать пришедшую почту, в какой бы кодировке она ни была. Однако слабое место такого подхода заключается в том, что для определения кодировки пришедшего письма программа полагается на информацию в заголовке письма, - а именно в поле Content-Type. Это поле для письма в КОИ8 должно иметь следующий вид:

Content-Type: text/plain; charset="koi8-r"

Разумеется, рассчитывать на то, что значение, указанное в этом поле (его заполняет почтовая программа отправителя), всегда будет соответствовать действительной кодировке письма, не приходится. И хотя МиниХост позволяет также выбирать кодировку для прочтения письма самостоятельно (имея некоторый навык, нужную кодировку нетрудно определить на глазок), иногда встречаются и более тяжелые случаи, с которыми такой одношаговой системе уже не справиться, - например, представьте, что будет, если текст был изначально написан в КОИ8, а затем перекодирован по таблице "CP1251 => КОИ8".

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

Ситуация с кодировками в World Wide Web одновременно и проще, и сложнее, чем в электронной почте. С одной стороны, стандартной общепринятой кодировки в русском WWW не существует - и это, конечно, плохо. С другой стороны, именно отсутствие стандарта заставляет российских Web-мастеров предусматривать у входа на свой узел целое меню кодировок, тем самым, удовлетворяя запросы максимального количества пользователей. Что, без всякого сомнения, хорошо (хотя, вероятно, и не слишком удобно).

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

Возможностью настраиваться на различные кодировки обладают, впрочем, не только поставщики информации в WWW, но и ее потребители. Оба самых распространенных на сегодня браузера - Netscape Navigator и Microsoft Internet Explorer - позволяют выбирать с помощью особого меню кодировку для просмотра текста HTML-документа (правда, если вы на компьютере с Windows хотите иметь возможность читать документы в КОИ8 с помощью Netscape Navigator 3.0, вам все равно придется устанавливать на компьютер шрифты в этой кодировке). Согласно требованиям стандарта, сервер, посылающий HTML-файл, должен в сопроводительной информации сообщить браузеру его кодировку, а браузер, получив эти сведения, - выбрать для отображения текста соответствующую кодировку из своего набора. Однако на практике эта возможность реализуется редко - ведь если пользователь, зайдя на узел, сам выбрал страницу, скажем, в CP1251, он тем самым удостоверяет, что браузер его в данный момент настроен именно на эту кодировку, и дополнительное согласование на протокольном уровне уже не нужно. Переключать кодировки вручную все же приходится, хотя и достаточно редко - например, когда вы попадаете по ссылке сразу на одну из внутренних страниц узла, минуя "прихожую" с меню выбора кодировки.

Пример 6.1. Представление фразы на русском языке в текстовом файле в кодировке ASCII

Саратов расположен на правом берегу реки Волга.

91 A0 E0 A0 E2 AE A2 20 E0 A0 E1 AF AE AB AE A6

A5 AD 20 AD A0 20 AF E0 A0 A2 AE AC 20 A1 A5 E0

A5 A3 E3 20 E0 A5 AA A8 20 82 AE AB A3 A0 2E

Пример 6.2. Представление фразы на русском языке в формате Unicode.

Саратов расположен на правом берегу реки Волга.

FF FE 21 04 30 04 40 04 30 04 42 04 3E 04 32 04

20 00 40 04 30 04 41 04 3F 04 3E 04 3B 04 3E 04

36 04 35 04 3D 04 20 00 3D 04 30 04 20 00 3F 04

40 04 30 04 32 04 3E 04 3C 04 20 00 31 04 35 04

40 04 35 04 33 04 43 04 20 00 40 04 35 04 3A 04

38 04 20 00 12 04 3E 04 3B 04 33 04 30 04 2E 00

0D 00 0A 00

Пример 6.2. Представление фразы на русском языке в формате Word.

Саратов расположен на правом берегу реки Волга.

D0 CF 11 E0 A1 B1 1A E1 00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00 3E 00 03 00 FE FF 09 00

06 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00

00 00 00 00 00 00 00 00 10 00 00 23 00 00 00 01

00 00 00 FE FF FF FF 00 00 00 00 20 00 00 00