Архивы: по дате | по разделам | по авторам

Загадочное семейство

Архив
автор : Владимир Лидовский   20.11.2003

Работая с Интернетом и электронной почтой, многие из вас наверняка не раз сталкивались с проблемой выбора кодировки для букв русского алфавита. Но что стоит за всеми этими малопонятными названиями типа cp866, koi-8r, UTF-8 или ISO 8859-5? И как вообще представляются символы в компьютере?

 Работая с Интернетом и электронной почтой, многие из вас наверняка не раз сталкивались с проблемой выбора кодировки для букв русского алфавита. Но что стоит за всеми этими малопонятными названиями типа cp866, koi-8r, UTF-8 или ISO 8859-5? И как вообще представляются символы в компьютере?

Прародитель

Для компьютерного представления текста необходимо каждому знаку присвоить некоторое число – его код. Все современные таблицы кодировок происходят от возникшей еще в 60-е годы 7-разрядной таблицы ASCII (American Standard Code for Information Interchange), которая содержит 33 кода команд или управляющих символов, большая часть которых сегодня не используется, и 95 кодов для различных знаков, достаточных для работы с английскими текстами. При 7-разрядном кодировании каждому символу сопоставляется 7 бит кода, т. е. число в диапазоне от 0 до 127. В простых текстовых (plain text) файлах допустимы только управляющие символы, отмечающие концы строк и переходы на позиции табуляции. Скажем, маркер конца строки в Linux — это код 10, в Macintosh OS — 13, в CP/M, DOS и Microsoft Windows — последовательность кодов 13, 10.

Для аналогичного представления знаков русского алфавита ныне применяется таблица КОИ-7 (Код для обмена информацией 7-битный): это та же ASCII, но в которой вместо строчных латинских букв и шести других символов размещены заглавные буквы кириллицы, а вместо заглавных — строчные. У такого кодирования есть два важных преимущества: оно компактно (для доступа к латинским и другим буквам и возврата обратно к кириллице используются специальные управляющие коды), и оно вводит естественную транслитерацию, что позволяет работать с текстами на русском единообразно на разных компьютерных системах.

ASCII-коды все еще достаточно широко используются для текстов на английском, особенно в США, а также в системах e-mail. Стандартные текстовые утилиты UNIX (grep, sed, awk) вплоть до середины 90-х по умолчанию могли работать только с ASCII — подключение 8-го бита требовало их перекомпиляции. Сегодня 7-битная кириллица встречается, пожалуй, только в системе для подготовки научных публикаций TEX, да и то неявно, а для кодирования символов алфавитов большинства языков используется 8-разрядное кодирование, т. е. кодирование, при котором каждому символу сопоставляется 8 бит или 1 байт кода. Код представляет собой число в диапазоне от 0 до 255, а первые 128 символов при таком кодировании аналогичны ASCII.

Потомок

Международный стандарт ISO/IEC 8859-1 стал в наши дни де-факто заменой для ASCII. В нем первые 32 кода, числа 128–159, соответствуют практически неиспользуемым управляющим символам, общим для всех таблиц кодировки ISO. Хотя 8859-1 может использоваться для текстов почти на всех западноевропейских языках, он не полностью покрывает нужды французского и финского. Этот недостаток, а также отсутствие знака для новой общеевропейской валюты привели в 1999 г. к возникновению кодировки 8859-15, в которой изменены значения восьми кодов 8859-1, в частности, установлено 164 (A4) — ? (20ac в UCS).

Всего в ISO 8859 определяются четырнадцать 8-битовых таблиц кодировки, например, 8859-6 содержит набор арабских букв, 8859-7 — греческих, а 8859-8 — иврита.

Сводный брат

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

Кодировка Unicode опирается на каталог символов UCS (Universal Character Set) стандарта ISO 10646. UCS может содержать до 231=2147483648 различных знаков и постоянно пополняется. Коды UCS-2 — 2-байтные, т. е. числа от 0 до 65535, а UCS-4 — 4-байтные, т. е. числа от 0 до 2147483647. ASCII — это первые коды UCS-2, а UCS-2 — это начало UCS-4. Двух и четырехбайтные коды Unicode могут представляться двумя способами: байты располагаются слева направо от старшего к младшему (Big Endian, BE) или от младшего к старшему (Little Endian, LE). Второй способ встречается в подавляющем большинстве случаев. Кроме того, для более компактного кодирования используются коды переменной длины UTF-8 (Unicode Transfer Format) — 1–6-байтные и UTF-16 — 2- или 4-байтные. Последние также существуют в двух видах (Little и Big Endian) и позволяют кодировать не более 220+216=1114112 знаков. Все коды UCS-2 являются также и кодами UTF-16. Есть еще формат UTF-7, который позволяет для большинства символов ASCII использовать 7-битные числа, — он обеспечивает доступ только к UCS-2. Коды Unicode 20 (пробел), A0 (неразрывный пробел) и AD (перенос), присутствующие во многих 8-разрядных таблицах, можно рассматривать как управляющие.

Часть кодов в UCS зарезервированы для личного или ограниченного локальными рамками использования. Остальные коды также сгруппированы по назначению, например, кириллице выделен диапазон 400–4FF16.

Все большее распространение в Интернете получает кодировка UTF-8, которая позволяет обходиться 8 битами для кодирования символов ASCII и 16 битами для кодирования символов большинства алфавитных письменностей, в т.ч. русской. Тексты в ASCII, в частности, на английском языке являются одновременно и текстами в UTF-8. Код UTF-8, последовательность байт, получается из кода каталога UCS по следующей однозначной схеме:

 

 

00000000–0000007F16 (0–127):

                     0xxxxxxx

 

 

 

00000080–000007FF16 (128–2047):

 

110xxxxx 10xxxxxx

 

 

 

00000800–0000FFFF16 (2048–65535):

 

1110xxxx 10xxxxxx 10xxxxxx

 

 

 

00010000–001FFFFF16 (65536–2097151):

 

11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

 

 

 

00200000–03FFFFFF16 (2097152–67108863):

 

111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

 

 

 

04000000–7FFFFFFF16 (67108864–2147483647):

 

1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx.

 

 

 

Позиции битов, обозначенные как буква x, заполняются соответствующими битами из кода символа в бинарном представлении. Используется кратчайшая из возможных многобайтовых последовательностей, которые могут представить код символа. Например, символ Unicode с кодом 169 = a916 = 1010 1001 (знак ©) кодируется в UTF-8 как 11000010 10101001 = c216 a916, а символ с кодом 8800 = 226016 = 0010 0010 0110 0000 (знак ) кодируется так: 11100010 10001001 10100000 = e216 8916 a016.

Unicode достаточно полно поддерживается современными программами – браузерами, офисными пакетами и т. п. В Linux используется UTF-8, а в Microsoft Windows еще и UCS-2. Пока поддержка UCS в Linux несколько слабее, чем в Microsoft Windows 2000/Me/XP. Главные проблемы при использовании Unicode — отсутствие соответствующего полного набора шрифтов и сложность ввода. Как, скажем, российскому пользователю вводить специфические испанские буквы, математические знаки, китайские иероглифы? Для этого приходится использовать те или иные программы – к примеру, может помочь текстовый редактор Yudit (www.yudit.org).

 Дела семейные

Единственный возможный способ для работы с кириллицей в системе без соответствующих шрифтов – это транслитерация. Для русского языка существует несколько систем транслитерации, разрабатываемых с начала XX века, — но ни одна из них не стала признанным стандартом. Главная проблема транслитерации заключается в том, что для представления 33 букв русского алфавита есть только 26 базовых букв латинского алфавита. Решение этой проблемы — в привлечении диакритических знаков, например, обозначая э как , или в использовании буквенных последовательностей, например, shch для обозначения щ. Первый способ не вписывается в базовый латинский алфавит, а второй может приводить к неоднозначностям: например, учитывая, что ч обозначается как ch, а шsh, как транслитерировать в латиницу слово веснушчатый? Неоднозначности можно было бы избежать, заключая буквенные последовательности между знаками (между < и > или подобными).

Можно использовать “компьютерную” транслитерацию на основе ASCII (КОИ-7) — код получается вычитанием 128 от соответствующего кода в koi8-r, что, как правило, дает код латинской буквы, фонетически близкой к русской. Недостатком этой “естественной” транслитерации является представление 11 букв русского алфавита (ЧчШшЩщъЭэЮю) в виде специальных знаков и отсутствие представления для букв ЁёЪ. Этот недостаток можно “сгладить”, используя для этих букв заключенные между скобками (квадратными, круглыми, угловыми...) стандартные транслитерационные последовательности.

Стандарт ГОСТ 7.79 от 2000 года также вводит почти взаимно-однозначную транслитерацию без использования диакритических знаков, и в нем нет возможности различать заглавные и строчные мягкий и твердый знаки.

Законные наследники

Существуют пять международно признанных таблиц кодировки русских букв:

  • ISO 8859-5стандарт международной организации по стандартизации для кириллицы, в РФ используется редко. Разработана на базе основной кодировки ГОСТ. В ней отсутствует псевдографика.

  • Кодовая страница 866 разработана на основе альтернативной кодировки ГОСТ. Она создана специально для ОС MS-DOS, в которой часто используются символы псевдографики. Практически вытеснена следующей таблицей.

  • Кодовая страница 1251 для Microsoft Windows стала популярной благодаря огромному влиянию фирмы Microsoft на рынок компьютерных технологий. Кроме того, в ней отсутствует ненужная в графических средах поддержка символов псевдографики и наиболее полно по сравнению другими кодировками представлены такие символы как ©, ®, №, различные виды кавычек и тире и т. п. Эта кодировка, несмотря на некоторые недостатки, например, наличие явно избыточных букв южнославянской кириллицы, была бы почти оптимальной, если бы она не была волюнтаристки навязана пользователям Microsoft Windows в РФ точно также как и в 1995 была навязана отличная от стандартной машинописной раскладка клавиатуры.

  • На базе ГОСТ КОИ-8, koi8-r (кодовая страница 878) — применяется в мире Linux. В ней естественным образом обеспечивается связь с 7-разрядным кодированием: отбрасыванием восьмого бита из кода буквы русского алфавита koi8-r получается код этой же буквы в КОИ-7. Эта кодировка поддерживает символы псевдографики, что занимает около половины всех кодов. В 1993 г. она стандартизирована в Интернете, а в начале XXI века появилось несколько ее модификаций, koi8-u и koi8-ub, — с дополнениями до украинского и затем, соответственно, до белорусского. В koi8-ub включаются вместо символов псевдографики знаки разнообразных кавычек и тире, №, евро, иены и т. п., но эта кодировка находится на начальной стадии внедрения и ее перспективы пока туманны.

  • Кодовая страница 10007 — используется на компьютерах под управлением Macintosh OS, по своему набору знаков почти совпадает с CP1251.

Буквы болгарского алфавита --- подмножество русского. CP866 позволяет работать также с текстами на украинском и белорусском, а кодировки ISO 8859-5, CP1251, CP10007 еще и на македонском и сербском.

Хорошие текстовые редакторы, среди которых можно отметить, например, отечественный заменитель Microsoft Notepad, Aditor (http://kulichki.rambler.ru/~kdavy/progs/aditor), могут во многих случаях, анализируя частоты встречаемости символов в простом текстовом файле, автоматически определять используемую кодировку. Документы HTML, XML, RTF и других развитых форматов текста с разметкой включают в себя информацию об используемом кодировании.

В IBM OS/2 для русских букв использовалась кодовая страница 855, интересная тем, что в ней коды для каждой строчной и прописной буквы кириллицы идут подряд, что напоминает рисунок алфавита.

Бедные родственники

Для кодирования кириллицы могут использоваться еще пять таблиц, не имеющие международного статуса:

  • Основная кодировка ГОСТ (государственный стандарт СССР) от 1987 года. Совпадает с ISO 8859-5 по знакам русских букв, кроме заглавной буквы Ё, расположенной как в CP866. Ее главный недостаток — символы псевдографики расположены не так, как на IBM PC. На практике эту кодировку можно встретить только на старых советских клонах IBM PC ЕС-1840 и в знакогенераторах принтеров, выпущенных до середины 90-х. Четыре символа из этой таблицы (они входят и в следующую) с кодами 242–245, , до сих пор не включены в Unicode.

  • Альтернативная кодировка ГОСТ отличается от CP866 только по позициям 242–251.

  • Модифицированная альтернативная кодировка ГОСТ отличается от CP866 толбко по позициям 242–247 и 252, 253.

  • Болгарская кодировка, называемая также “старый вариант ВЦ АН СССР”, Interprog или MIC, получается механическим внесением блока из 64 букв русского алфавита (такого же как в CP1251) в позиции 128–191 CP437 (стандартный знакогенератор IBM PC).

  • КОИ-8 — исторически ее варианты использовались на компьютерах под управлением ОС Unix, CP/M и некоторых других с середины 1970-х. На IBM PC не получила распространения из-за неалфавитного расположения букв кириллицы, чему придавалась возможно чрезмерное значение (действительно, такой порядок есть только для английского языка и ни для какого другого). Вместо нее в среде MS-DOS использовали в основном сначала болгарскую, затем основную и, наконец, варианты альтернативной (базовую, затем модифицированную и затем CP866). В ней нет букв ЁёЪ, а остальные буквы совпадают с koi8-r.

Литература

Галенко В. Т. Русский язык и латиница //НТИ. Серия 1, 10/2000.

Лидовский В. В. Первичная машинная обработка текстов: методика и проблематика --- Депон. в ИНИОН РАН “53656, 1998.

Малютин Э. А. Кодовые таблицы персональных компьютеров — М.: МП “Память”, 1991.

Соснин О. М. О русско-латинской транслитерации личных имен, фамилий и географических названий в официальных документах //НТИ. Серия 1, 2/2003.

Gilyarevsky R. S., Grivnin V. S. Language identification guide — M.: “Nauka” Publishing House, 1970.

ISO9: Information and documentation — Transliteration of Cyrillic characters by Latin characters — Slavic and non-Slavic Languages — Geneve, 1995.

Материалы сайта www.unicode.org.

© ООО "Компьютерра-Онлайн", 1997-2024
При цитировании и использовании любых материалов ссылка на "Компьютерру" обязательна.