WebClub - Всероссийский Клуб Веб-разработчиков
WebClub.RU » Архив » Русский Вавилон

Русский Вавилон


Дата публикации: 16-03-2013

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

Эта статья - не сборник инструкций по русификации каких-то определенных программ или операционных систем (в Сети уже есть достаточно полные подборки информации такого рода - см., например, [1] или [2]). Мне показалось более интересным собрать воедино справочный и обзорно-исторический материал обо всех кодировках кириллицы, представляющих хоть какой-то практический интерес, а также рассказать о проблемах "кириллического столпотворения" в Сети.
Действующие лица

Хронологически одним из первых стандартов кодирования русских букв на компьютерах был КОИ8 ("Код обмена информацией, 8-битный"). Эта кодировка применялась еще в доисторические советские времена на компьютерах серии ЕС ЭВМ, и когда в середине 80-х появились первые русифицированные версии операционной системы UNIX, они переняли эту кодировку у своих "старших братьев". Сеть Релком, с которой начинался российский Интернет в начале 90-х и которая поначалу состояла в основном из компьютеров с UNIX, также приняла кодировку КОИ8 в качестве стандартной. В результате сейчас КОИ8 является единственно допустимой кодировкой в русскоязычной электронной почте и телеконференциях и одной из кодировок, которые обязательно должна поддерживать любая русская страница в WWW.

Вторая по значению в русском Интернете (и, безусловно, первая по употребимости на персональных компьютерах) кодировка - это стандартная кириллическая кодировка 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 в Интернете - да и вообще в компьютерном мире - встречается крайне редко.

Ну и наконец, настоящей жемчужиной в ожерелье русских (как и любых других, впрочем) кодировок является международный стандарт Unicode, созданный (уже довольно давно) с благородной целью положить конец компьютерным страданиям национальных меньшинств - всех тех, кому для передачи звуков родного языка недостаточно первых 128 символов ASCII. В отличие от всех остальных кодировок, упомянутых выше, Unicode отводит на каждый символ не один байт, а два, и потому с его помощью можно закодировать не 256 символов, а целых 65536. Полная спецификация стандарта Unicode представляет собой довольно толстую книгу и включает в себя все существующие, вымершие и искусственно созданные алфавиты мира, а также множество математических, музыкальных, химических и прочих символов. Пока что Unicode имеет весьма ограниченное распространение, но есть надежда, что для русского языка он со временем сможет потеснить (если не совсем вытеснить) все остальные кодировки. В частности, Unicode встроен в язык программирования Java, который, судя по всему, будет лежать в фундаменте сетевых приложений и операционных систем будущего.

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

В таблице 1 приведены (в шестнадцатеричной записи) коды букв и некоторых специальных типографских символов, встречающихся в русских текстах, для всех перечисленных выше кодировок кириллицы. В квадратных скобках в первой строке указаны номера ссылок, с помощью которых вы сможете найти в Интернете полную спецификацию для каждой кодировки. Тем, кого интересуют общие вопросы построения кодовых таблиц для разных языков или дополнительная справочная информация, можно порекомендовать стандарт RFC 1345 [3], содержащий определение огромного количества разных кодовых страниц, коллекцию материалов по адресу [4], собранную автором этого RFC, документ [5], а также главу из книги "HTML Unleashed" [14], содержащую обзор стандартов кодирования национальных символов и рассказывающую о проблемах интернационализации языка HTML.

   KOI8-R[6]     CP1251[7]     CP866[8]     Mac[9]     ISO 8859-5[10]     Unicode[11]
А     E1     C0     80     80     B0     0410
Б     E2     C1     81     81     B1     0411
В     F7     C2     82     82     B2     0412
Г     E7     C3     83     83     B3     0413
Д     E4     C4     84     84     B4     0414
Е     E5     C5     85     85     B5     0415
Ж     F6     C6     86     86     B6     0416
З     FA     C7     87     87     B7     0417
И     E9     C8     88     88     B8     0418
Й     EA     C9     89     89     B9     0419
К     EB     CA     8A     8A     BA     041A
Л     EC     CB     8B     8B     BB     041B
М     ED     CC     8C     8C     BC     041C
Н     EE     CD     8D     8D     BD     041D
О     EF     CE     8E     8E     BE     041E
П     F0     CF     8F     8F     BF     041F
Р     F2     D0     90     90     C0     0420
С     F3     D1     91     91     C1     0421
Т     F4     D2     92     92     C2     0422
У     F5     D3     93     93     C3     0423
Ф     E6     D4     94     94     C4     0424
Х     E8     D5     95     95     C5     0425
Ц     E3     D6     96     96     C6     0426
Ч     FE     D7     97     97     C7     0427
Ш     FB     D8     98     98     C8     0428
Щ     FD     D9     99     99     C9     0429
Ъ     FF     DA     9A     9A     CA     042A
Ы     F9     DB     9B     9B     CB     042B
Ь     F8     DC     9C     9C     CC     042C
Э     FC     DD     9D     9D     CD     042D
Ю     E0     DE     9E     9E     CE     042E
Я     F1     DF     9F     9F     CF     042F
а     C1     E0     A0     E0     D0     0430
б     C2     E1     A1     E1     D1     0431
в     D7     E2     A2     E2     D2     0432
г     C7     E3     A3     E3     D3     0433
д     C4     E4     A4     E4     D4     0434
е     C5     E5     A5     E5     D5     0435
ж     D6     E6     A6     E6     D6     0436
з     DA     E7     A7     E7     D7     0437
и     C9     E8     A8     E8     D8     0438
й     CA     E9     A9     E9     D9     0439
к     CB     EA     AA     EA     DA     043A
л     CC     EB     AB     EB     DB     043B
м     CD     EC     AC     EC     DC     043C
н     CE     ED     AD     ED     DD     043D
о     CF     EE     AE     EE     DE     043E
п     D0     EF     AF     EF     DF     043F
р     D2     F0     E0     F0     E0     0440
с     D3     F1     E1     F1     E1     0441
т     D4     F2     E2     F2     E2     0442
у     D5     F3     E3     F3     E3     0443
ф     C6     F4     E4     F4     E4     0444
х     C8     F5     E5     F5     E5     0445
ц     C3     F6     E6     F6     E6     0446
ч     DE     F7     E7     F7     E7     0447
ш     DB     F8     E8     F8     E8     0448
щ     DD     F9     E9     F9     E9     0449
ъ     DF     FA     EA     FA     EA     044A
ы     D9     FB     EB     FB     EB     044B
ь     D8     FC     EC     FC     EC     044C
э     DC     FD     ED     FD     ED     044D
ю     C0     FE     EE     FE     EE     044E
я     D1     FF     EF     DF     EF     044F
Ё     B3     A8     F0     DD     A1     0401
ё     A3     B8     F1     DE     F1     0451
« (открывающая кавычка "елочкой")     -     AB     -     C7     -     00AB
» (закрывающая кавычка "елочкой")     -     BB     -     C8     -     00BB
№ (номер)     BE*     B9     FC     DC     F0     2116
– (en-dash, короткое тире)     -     96     -     D0     -     2013
— (em-dash, длинное тире)     -     97     -     D1     -     2014
Неразрываемый пробел     9A, A0**     A0     FF     CA     A0     00A0
*Спецификация КОИ8 (RFC 1489, [6]) предписывает для кода BE символ "FORMS DOUBLE VERTICAL AND HORIZONTAL" ("Крест из двойных горизонтальных и вертикальных линий"), но большинство КОИ8-шрифтов для WWW размещают в этом месте символ номера ("NUMERO SIGN").
**Стандарт предписывает для кода A0 символ "FORMS DOUBLE HORIZONTAL" ("Двойная горизонтальная черта"), а для неразрываемого пробела отводит код 9A. Однако большинство КОИ8-шрифтов для WWW в целях лучшей совместимости с CP1251 помещают неразрываемый пробел и по адресу A0.

Таблица 1. Шестнадцатеричные коды русских букв в основных кириллических кодовых таблицах

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

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

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

Однако в последнее время, когда все больше пользователей переходят на прямое IP-подключение к Интернету и осваивают обмен почтой по протоколам SMTP и POP, на сцену выходит множество новых почтовых программ, нередко нерусифицированных и не имеющих никакого представления о необходимости перекодировать отправляемую почту (например, Eudora или почтовый клиент, встроенный в броузер Netscape Navigator версий до 3.0 включительно). В большинстве случаев этот недостаток почтовых программ можно восполнить, установив на компьютер клавиатурный драйвер и шрифты в кодировке КОИ8. К сожалению, множество пользователей либо вообще не подозревают о необходимости такой дополнительной настройки, либо не знают, с чего ее начать и как довести до успешного конца (здесь будет уместно еще раз порекомендовать замечательное руководство по адресу [1]). В результате электронная почта и особенно телеконференции заполонены сейчас письмами в "чужих" кодировках (чаще всего в CP1251), иногда вдобавок еще и зашифрованными чем-нибудь вроде Base64 или Quoted Printable (алгоритмы, предназначенные для превращения бинарного файла в последовательность печатаемых символов из первой половины таблицы ASCII).

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

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

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

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

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

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

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

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

Домен продается

Популярное

Не так давно в сети появился новый сервис, под названием Dead Man Zero. Этот сервис сделал...
Рынок социальных площадок уже давно стал стабильным. Несмотря на то, что время от времени...
Artisteer 4 – единственный в своем роде продукт, позволяющий автоматизировать работу над созданием...
Апрель 2024 (1)
Октябрь 2018 (14)
Февраль 2017 (3)
Январь 2017 (1)
Август 2016 (1)
Май 2016 (2)

Карта сайта: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41

Друзья сайта



Случайная цитата

Bjarne Stroustrup:

"Я всегда мечтал о том, чтобы моим компьютером можно было пользоваться так же легко, как телефоном; моя мечта сбылась: я уже не могу разобраться, как пользоваться моим телефоном."

Опрос

Какой браузер Вы используете?

Internet Explorer
Google Chrome
Mozilla Firefox
Netscape Navigator
Maxthon Browser
Opera
Mozilla Suite
SeaMonkey
K-Meleon
Safari
Amaya
Avant Browser
SlimBrowser
Другой...