[ Страница назад | Страница вперед | Содержание | Индекс | Библиотека | Юридическая информация | Поиск ]

Руководство по принтерам и печати


Таблицы перевода кодовой страницы принтера

Перевод кодовых знаков файла печати в кодовые знаки для принтера происходит в два этапа (перевод кодовых знаков для восточных языков выполняется по-другому). На первом этапе кодовые знаки файла преобразуются в кодовые знаки промежуточной кодовой страницы. В промежуточной кодовой странице каждому поддерживаемому символу соответствует 16-разрядный целый кодовый знак. Первые 256 кодовых знаков промежуточной кодовой страницы совпадают с Кодовой страницей 850 IBM, за исключением кодовых знаков от 0 до 31 (в десятичной системе), которые соответствуют управляющим символам ASCII. Промежуточная кодовая страница определяется в файле /usr/lib/lpd/pio/etc/codepage.txt.

Первый этап перевода

Приведенная ниже программа на языке C выполняет первый этап, создавая таблицу перевода гипотетической кодовой страницы 123 в промежуточную кодовую страницу.

#include <piostruct.h>
#include <fcntl.h>
/*** Таблица перевода кодовых знаков исходной кодовой страницы  ***/
/*** "123" в кодовые знаки промежуточной кодовой страницы     ***/
short table[256] = {
/* 00 (000) */ CP, CP, CP, CP,
.
.
.
/* FC (252) */ CP, SC, 126, CP };
/*** Запись таблицы в файл (об ошибках обработки не сообщается) ***/
main ( ) {
int fildes;
int fmt_type = 1;
fildes = open("/usr/lib/lpd/pio/transl/123", O_CREAT | O_WRONLY,\
0664);
write(fildes, "PIOSTAGE1XLATE00", 16);
write(fildes, &fmt_type, sizeof(fmt_type));
write(fildes, table, sizeof(table));
return(0);
}

Символы CP при кодовом знаке 252 означают, что он должен копироваться без изменения. Символы SC при кодовом знаке 253 - что символ не определен в промежуточной кодовой странице, поэтому при печати он должен быть заменен символом подстановки. Цифры 126 при кодовом знака 254 - что кодовый знак 254 должен быть переведен в кодовый знак 126.

Флаг -X в команде qprt задает имя кодовой страницы файла. Если флагу присвоено значение 123, то программа форматирования считывает таблицу из файла /usr/lib/lpd/pio/trans1/123 и использует ее на первом этапе перевода.

Второй этап перевода

На втором этапе перевода одна или несколько таблиц перевода преобразуют кодовые знаки промежуточной кодовой страницы в кодовые знаки для конкретного принтера. Полные имена таблиц перевода, применяемых на втором этапе, задаются с помощью атрибутов t0-t9 в файле описания базы данных. Каждый из атрибутов t0-t9 может содержать несколько имен таблиц, разделенных запятыми. Программа форматирования печати считывает эти таблицы перевода и формирует из них кольцевой список. Программа форматирования обрабатывает каждый символ в исходном файле печати, начиная с таблицы для кодовой страницы текущего принтера. Сначала программа определяет, содержится ли символ в кодовой странице данного принтера. Другими словами, она определяет, не превышает ли значение кодового знака количества кодовых знаков в таблице и не равно ли оно SC.

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

Приведенная ниже программа на языке C выполняет второй этап перевода, создавая таблицу с именем XYZ.999 для перевода знаков промежуточной кодовой страницы в знаки кодовой страницы принтера. Предполагается, что атрибут c1 содержит строку команд для принтера, которая выбирает для него кодовую страницу XYZ.999.

#include <piostruct.h>
#include <fcntl.h>
/*** Таблица перевода кодовых знаков промежуточной кодовой ***/
/*** страницы в кодовые знаки кодовой страницы принтера    ***/
struct transtab table[] = {
/* 00 (000) */ {CP}, {CP}, {CP}, {CP},
.
.
.
/* FC (252) */ {63}, {CP}, {94,1}, {SC} };

/*** Имена команд для таблицы перевода ***/
char cmdnames[][2] = {
{'c', '1'},              /* индекс 0 - выбор кодовой страницы       */
{'e', 'b'} };            /* индекс 1 - следующий байт - графический */

/*** Запись таблицы в файл (об ошибках обработки не сообщается) ***/
main() {
int fildes;
int num_commands = sizeof(cmdnames) / 2;
fildes = open("/usr/lib/lpd/pio/trans2/XYZ.999", O_CREAT |
O_WRONLY,\ 0664);
write(fildes, "PIOSTAGE2XLATE00", 16);
write(fildes, &num_commands, sizeof(num_commands));
write(fildes, cmdnames, sizeof(cmdnames));
write(fildes, table, sizeof(table));
return(0);
}

Символы {63} при кодовом знаке 252 означают, что кодовый знак 252 перед отправкой на принтер должен быть преобразован в кодовый знак 63. Символы {CP} при кодовом знаке 253 - что кодовый знак 253 должен быть направлен на принтер без преобразования. Символы {94,1} при кодовом знаке 254 - что кодовый знак 254 перед отправкой на принтер должен быть преобразован в кодовый знак 94. Цифра ,1 в {94,1} указывает, что перед пересылкой кодового символа на принтер необходимо направить строку команд принтера, для которой двухсимвольное имя параметра записано в элементе массива Command Names с индексом 1. Символы SC при кодовом символе 255 указывает, что символ, соответствующий кодовому знаку 255 в промежуточной кодовой странице, не может быть напечатан с помощью кодовой страницы принтера, описываемой таблицей перевода второго этапа.


[ Страница назад | Страница вперед | Содержание | Индекс | Библиотека | Юридическая информация | Поиск ]