Процедура перевода многобайтового кодового набора (MBCS) файла печати в кодовый набор отличается от процедуры перевода кодовых символов однобайтового кодового набора (SBCS). Перевод файла печати в кодовый набор в многобайтовой среде осуществляется в два этапа.
На первом этапе исходный кодовый набор файла печати переводится в промежуточный кодовый набор. Этот набор должен быть одним из наборов MBCS, поддерживаемых подпрограммой iconv и базой данных локалей (DB); например, IBM-943, IBM-eucTW или IBM-eucKR. На втором этапе промежуточный кодовый набор переводится в соответствующий выходной кодовый набор для принтера. Перевод кодового набора осуществляется подпрограммой iconv, если она существует. Если исходный или полученный кодовый набор совпадает с промежуточным кодом, то перевод не выполняется.
Атрибуты Ti и To в файле описания конкретного принтера определяют ход процесса перевода кодового набора. Параметр Ti задает сочетание исходного и промежуточного кодовых наборов:
[Исходный_кодовый_набор, ... ]Промежуточный_кодовый_набор, ...
Параметр To задает сочетание промежуточного и выходных кодовых наборов:
Промежуточный_кодовый_набор [Выходной_кодовый_набор0, Выходной_кодовый_набор1, Выходной_кодовый_набор2, Выходной_кодовый_набор3,... ], ...
Например, параметр To для принтера, предназначенного для японского языка, определяется следующим образом:
::To::IBM-943[IBM-932, IBM-932, IBM-932], ibm-eucJP[IBM-932, IBM-932, IBM-932,IBM-932]
Все символы набора с данным идентификатором (CSID) печатаются с использованием шрифтов ПЗУ, если для каждого CSID задан выходной кодовый набор. В противном случае применяются битовые образы шрифтов из Xwindows. Тип файлов шрифтов Xwindows, включающих образ шрифта каждого CSID, определяется с помощью файла из каталога /usr/lib/X11/nls.
Таблица перевода задает соответствие между кодовыми знаками, которые не могут использоваться совместно двумя кодовыми наборами. Базовая программа принтера может взаимодействовать с другими кодовыми наборами, даже если они не поддерживаются подпрограммой iconv, используя таблицу перевода из каталога /usr/lib/lpd/pio/transJP. Если исходный или выходной кодовый набор не поддерживается подпрограммой iconv, то неподдерживаемый кодовый набор переводится в один из поддерживаемых кодовых наборов или непосредственно в промежуточный кодовый набор с помощью таблиц перевода из каталога /usr/lib/lpd/pio/transJP. Пользователи root могут добавлять новые кодовые наборы для принтеров, создавая свои таблицы перевода.
Имена новых таблиц перевода следует задавать в формате Имя_исходного_кодового_набора_Имя_целевого_кодового_набора. Все таблицы перевода должны быть определены в файле trans_dir. Исходные кодовые знаки f_cp в таблице перевода должны быть заранее упорядочены по алфавиту.
Файлы trans_dir и codeset.alias находятся в каталоге /usr/lib/lpd/pio/transJP. Исходные кодовые знаки f_cp в таблице перевода должны быть заранее упорядочены по алфавиту.
Формат файла trans_dir следующий: Формат файла trans_dir следующий:
Имя_исходного_кодового_набора Имя_целевого_кодового_набора Имя_файла_перевода
Псевдонимы кодовых наборов задаются в файле codeset.alias. Формат файла codeset.alias следующий:
Имя_кодового_набора Псевдоним ...
Например, для того чтобы напечатать на принтере IBM-943 файл MBCS, который был записан с использованием нового кодового набора, выполните следующие действия:
newcodeset IBM-943 Новый_кодовый_набор_IBM-943
::Ti::[Имя_нового_кодового_набора, ...]IBM-943, ...
Для печати символов, которые отсутствуют в ПЗУ принтера, базовые программы принтеров MBCS используют шрифты Xwindows, определенные в каталоге /usr/lib/X11/fonts. Шрифты Xwindows для принтера задаются флагами -F и -I команды qprt. Значения этих параметров команды qprt по умолчанию задаются в файле описания как значения атрибутов _F и _I.
Флаг qprt -F определяет шрифт. С флагом -F может применяться полное имя, псевдоним шрифта или Описание логической функции Xwindow (XLFD) шрифта Xwindows.
Флаг -I содержит путь к каталогу, в котором находятся шрифты Xwindows, и создает запись атрибута _I. Формат атрибута _I в файле описания следующий:
::_I::/usr/lib/X11/fonts/JP,/usr/lib/X11/fonts
Если пользователь указывает другой путь к шрифту в команде qprt -I, то базовая программа принтера ищет шрифты в этом каталоге, а не в каталогах, заданных по умолчанию в атрибуте _I файла описания. Если параметру -I присвоено пустое значение, то базовая программа выполняет поиск в каталоге по умолчанию, /usr/lib/X11/fonts.
Для того чтобы задать шрифт Xwindows с помощью полного имени, псевдонима шрифта или XLFD, введите:
$ qprt -F '*-27-*-ibm_udcjp' foo.txt /* Список имен XLFD */ $ qprt -F IBM_JPN17 / * Псевдоним шрифта */
В этом примере базовой программе принтера MBCS сообщается, что она должна найти подходящие шрифты для кодового набора, заданного в параметре -X команды qprt, в файлах fonts.alias и fonts.dir.
#include <fcntl.h> struct trans_table /*Структура таблицы перевода */ { unsigned int reserv1; /* Зарезервировано */ unsigned int f_cp; /* Исходный кодовый знак */ unsigned int reserv2; /* Зарезервировано */ unsigned int t_cp; /* Целевой кодовый знак */ }; /* *Таблица перевода кодовых знаков исходного кодового набора (Новый_кодовый_набор) *в кодовые знаки промежуточного кодового набора (IBM-943). */ struct trans_table table[] = { {0x0,0x81ca,0x0,0xfa54},{0x0,0x9e77,0x0,0x954f},\ {0x0,0x9e8d,0x0,0x938e}, /* .... */ [0x0,0xfad0,0x0,0x8d56} }; /* Запись таблицы. Об ошибках обработки не сообщается. */ main() { int ftrans; long hdsize = 32; /* Размер заголовка */ long cpsize = 4; /* Размер кодового знака */ long rsv1 = 0, rsv2 = 0; /* Зарезервированная область */ ftrans = open("usr/lib/lpd/pio/transJP/newcodeset_IBM-932", O_CREAT | O_WRONLY, 0664); write(ftrans, "PIOSMBCSXLATE000", 16); write(ftrans, &hdsize, sizeof(long)); write(ftrans, &cpsize, sizeof(long)); write(ftrans, &rsv1, sizeof(long)); write(ftrans, &rsv2, sizeof(long)); write(ftrans, table, sizeof(table)); return(0); }