«Қоғамды ақпараттандыру» III Халықаралық ғылыми-практикалық конференция
300
УДК 004.512
АБДИБЕКОВ А.У., ЖАКЕБАЕВ Д.Б.
Казахский национальный университет им. аль-Фараби, Алматы, Казахстан СОЗДАНИЯ КАЗАХСКОЙ КОДИРОВКИ В КОНСОЛИ LINUX НА ПРИМЕРЕ
KOI8-RK
Гибкая и динамичная система разработки, невозможная для проектов с закрытым кодом, определяет исключительную экономическую эффективность Linux. Низкая, в сравнение с закрытыми, стоимость свободных разработок, отлаженные, благодаря Интернету, механизмы тестирования и распространения, привлечение людей из разных стран, обладающих разным видением проблем, защита кода лицензией GPL, является причиной успеха свободных программ. Открытый код значительно снижает себестоимость разработки для Linux систем и позволяет снизить цену решения для конечного пользователя[1].
Международный стандарт ISO 10646 дает определение Univesal Character Set (UCS) (Универсальный Набор Символов - Юникод). UCS содержит все символы других стандартов и кодировок. Его использование гарантирует полную взаимозаменяемость, то есть таблицы для конвертирования могут быть построены таким образом, что не произойдет потери информации при конвертировании строки из одной кодировки в UCS и обратно. UCS содержит символы, необходимые для представления практически всех известных сейчас языков. В него включены не только такие языки, как латинский, греческий, кириллица, иврит, арабский, армянский, грузинский, но также и японские, китайские и корейские идеограммы, а также такие языки, как бенгальский, тамильский, тайский, малайский, тибетский, хмерский, рунический, эфиопский, лаосский, чероки, монгольский, Gurmukhi, Gujarati, Hiragana, Katakana, Hangul, Devanagari, Oriya, Telugu, Kannada, Bopomofo, Canadian Syllabics, Ogham, Myanmar, Sinhala, Thaana, Yi и многие другие.
Для не перечисленных выше языков постоянно ведутся работы для поиска их самой оптимальной кодировки для компьютеров. Это не только такие языки, как различные иероглифические языки и языки из индоевропейской исторической группы, но и некоторые искусственные языки, такие как Tengwar, Cirth, и Klingon. Также UCS содержит большое множество графических, типографических, математических и научных символов, используемых в таких программах, как TeX, PostScript, APL, MS-DOS, MS-Windows, Macintosh, шрифты OCR и многих других текстовых процессорах и издательских системах, и таких символов постоянно добавляется еще больше. Стандарт UCS (ISO 10646) описывает архитектуру 31-битных наборов символов , состоящую из 128 24-битных групп, каждая из которых разделена на 256 16-битных плоскостей каждая из которых состоит из 256 8-битных строк и 256 колонок, каждая для одного символа.
Часть 1 стандарта (ISO 10646-1) определяет первые 65534 позиций кодов (с 0x0000 по 0xfffd), каждая из которых образует Basic Multilingual Plane (BMP) (Основную Многоязычную Матрицу), являющуюся плоскостью 0 в группе 0. Часть 2 стандарта (ISO 10646-2) добавляет символы в группу 0 извне BMP в некоторые дополнительные плоскости в диапазон от 0x10000 до 0x10ffff. BMP содержит все символы, используемые в других наборах символов. Дополнительные плоскости, добавляемые ISO 10646-2 покрывают некоторые особенные, специальные и экзотические символы используемые в науке, печати словарей, издательской индустрии.
Представление каждого символа в UCS как 2-байтного слова основывается на форме UCS-2 (только для символов BMP), поскольку UCS-4 является представлением каждого символа 4-байтным словом. Также существуют 2 формы кодировки UTF-8 для совместимости со старыми программами с обработкой ASCII- кодировок и UTF-16 для совместимости с обработкой не-BMP символов до 0x10ffff программами UCS-2.
Символы UCS от 0x0000 до 0x007f идентичны обычному US - ASCII набору символов, а символы в диапазоне от 0x0000 до 0x00ff идентичны символам в ISO 8859-1 Latin-1[2-5].
В BMP символы с 0xe000 до 0xf8ff никогда не будут использованы стандартными символами и зарезервированы для использования системой. В Linux эта область делится на две части: первая (с 0xe000 по 0xefff) может использоваться конечным пользователем, а вторая (так называемая зона Linux), начинающаяся с 0xf000 и заканчивающаяся 0xf8ff, которая может использоваться всеми пользователями Linux.
Рассмотрим схематически процесс вывода на экран некоторого символа "x": Прикладная программа, желая вывести "x" на экран, записывает в стандартный поток вывода соответствующую ему последовательность байт, которая, в конечном счете, достигает драйвера консоли (часть ядра Linux). Если драйвер консоли в этот момент находится в режиме UTF, он предполагает, что входные данные были записаны именно в этой кодировке, и использует стандартный алгоритм для преобразования UTF в Unicode
«Қоғамды ақпараттандыру» III Халықаралық ғылыми-практикалық конференция
301
(внутренняя кодировка ядра). В противном случае (т.н. "однобайтовый" или "ASCII" режим) драйвер использует таблицу перекодировки символов (Application Character Map, ACM) для перевода входного потока в Unicode. В ядре Linux отведено место для четырех таблиц ACM: cp437, vt100, iso01 и user-defined.
Последнюю из них как раз и можно использовать для вывода однобайтовых кириллических кодировок (например, KOI8-RK). Выбор пользовательской кодировки осуществляется ESC-последовательностью ".
Теперь, когда драйверу консоли известен Unicode-код "x", он должен определить, какой глиф в текущем шрифте ему соответствует. Для этого используется таблица экранного шрифта (Screen Font Map, SFM). Для большинства современных шрифтов таблица SFM хранится в том же файле, что и глифы (признаком этого является расширение .psfu у файла шрифта).
После определения номера глифа, ядро дает команду видеоподсистеме. Знакогенератор, используя загруженный в него шрифт, воссоздает на экране изображение "x".
Для кириллизации консоли в Linux используются два конкурирующих пакета: KBD и Consoletools.
Оба пакета имеют сходную функциональность. Все необходимые для работы этих пакетов файлы хранятся в директории /lib/kbd: /lib/kbd/consolefonts (файлы шрифтов), /lib/kbd/consoletrans (ACM), /lib/kbd/unimaps (SFM) и /lib/kbd/keymaps (клавиатурные раскладки)[2,6].
В дальнейшем будем предполагать, что используется пакет kbd. Утилита setfont из этого пакета позволяет, как загружать шрифты, так и устанавливать таблицы перекодировки ACM (параметр командной строки -m) и SFM (-u). Параметры можно комбинировать. Так, например, команда setfont Cyr_a8x16 -m koi2alt устанавливает шрифт Cyr_a8x16 и ACM-таблицу koi2alt.
Рассмотрим теперь, как организован процесс адаптация Linux для отображения символ кириллицы. В первую очередь обратимся к файлу /etc/sysconfig/i18n. В нем определяются значения следующих переменных:
SYSFONT - имя шрифта. Расширение указывать необязательно.
SYSFONTACM - имя ACM-таблицы.
UNIMAP - имя SFM-таблицы.
LANG - определяет локаль (locale). Если название локали заканчивается на "UTF-8"
(например, "ru_RU.UTF-8"), драйвер консоли переводится в режим UTF. Список установленных в системе локалей возвращается командой locale –a[7].
Предпочтительной кодировкой является UTF-8. Устанавливаемые по умолчанию шрифт
"latarcyrheb-sun16" и локаль "en_US.UTF-8" позволяют корректно отображать символы латинского, русского и арабского алфавитов, а также иврита[3]. Обратите внимание, что для многобайтовых UTF- локалей не столь важно, к какому языку они относятся: единственным ощутимым изменением при использовании "kz_KZ.UTF-8" будет смена формата представления даты, времени, валюты и языка интерфейса некоторых программ (собственно, UTF-8 и Unicode и были созданы для того, чтобы обеспечить единообразие работы с любым алфавитом). Используемый по умолчанию шрифт уже содержит символы кириллицы, а консоль работает в режиме UTF, поэтому символы русского алфавита должны выводиться без дополнительных усилий, когда как символы казахского алфавита в этом шрифте отсутствуют, и должны будут также включены в шрифт. К сожалению, в данной схеме возникает неприятный побочный эффект - сильно затрудняется вывод данных в не-UTF кодировке (например KOI8-RK). И если с кириллицей в именах файлов на vfat-разделах справиться достаточно легко (в параметрах монтирования в /etc/fstab необходимо указать "codepage=866,iocharset=utf8"
вместо традиционного "codepage=866,iocharset=koi8-rk"), с русскоязычными документами придется основательно повозиться: Midnight Commander 4.6.0 не умеет перекодировать в UTF-8. Кроме того, некоторые приложения могут некорректно работать в UTF-локали, поскольку не поддерживают многобайтовые кодировки (за примером далеко ходить не надо - взять все тот же Midnight Commander). Для корректной работы Midnight Commander в многобайтовые кодировки необходимо изменения исходного кода программы и пересобрать пакет.
Таблица 1- Параметры настройки кодовых преобразований и локалей
Локаль Charmap Screenmap Keytable Encoding
kz_KZ.UTF-8 UTF-8 Trivial kz-utf.map UTF-8
kz_KZ.KOI8-RK KOI8-RK Trivial kz.map KOI8-RK
«Қоғамды ақпараттандыру» III Халықаралық ғылыми-практикалық конференция
302
Таким образом, открытость и гибкость системы приводит к расширению числа пользователей ОС Linux, и окажут непосредственное влияние на создание собственной бюджетной операционной системы.
Литература
1. Бендел Д., Нейпир Р. Использование Linux. М.: СПб.: Киев: Вильямс, 2002.
2. Хатч Б., Ли Д., Курц Д. Секреты хакеров. Безопасность Linux — готовые решения. М.:
СПб.: Киев: Вильямс, 2002.
3. Deitel H. M. "Operating Systems", 2nd Ed., Reading, MA: Addison-Wesley, 1990.
4. Engler, D. R., Kaashoek, M. F., and O'toole, J. Jr., "Exokernel: An Operating System Architecture for Application-Level Resource Management", Proc. 15th Symp. on Operating Systems Principles, ACM, pp. 251-266, 1995.
5. Hauser, C, Jacobi, C, Theimer, M., Welch, В., and Weiser, M., "Using Threads in Interactive Systems: A Case Study", Proc. 14th Symp. on Operating Systems Principles, ACM, pp. 94-105, 1993.
6. Рейчард К., Фолькердинг П. Linux: cправочник. СПб.: Питер Ком, 1998.
7. Митчел М., Оулдем Д., Самьюэл А. Программирование для Linux. Профессиональный подход. М.: СПб.: Киев: Вильямс, 2002.