阶段 2 打印机代码页转换
在代码点转换的第二阶段,一个或多个第二阶段转换表将中间代码页的代码点转换为适用于打印机的代码点。
数据库冒号文件中的 t0 - t9 属性指定第二阶段转换表的完整路径名。 t0 - t9 中的每个属性都可以指定多个第二阶段转换表,转换表名称用逗号分隔。 打印格式化程序将读取第二阶段转换表,并将它们连成一个环。 从当前打印机代码页的表开始,格式化程序将处理输入打印文件中的每个字符。 首先要确定的是字符是否已在该打印机代码页中定义。 换句话说,代码点的值不大于表中代码点数,而且这个值不是 SC。
如果字符在代码页中,那么转换后的代码点将发送到打印机。 格式化程序通过发送适当的打印机命令字符串来选择打印机代码页。 根据约定,打印机命令字符串由两个字符组成的属性名称在命令名数组中的索引 0 处。 如果字符不在代码页中,那么格式化程序会对环中的下一个第二阶段转换表重复此过程。 如果格式化程序在环中找不到能够打印字符的转换表,那么它将打印一个替换字符(下划线)来代替。
以下示例 C 语言代码生成一个名为 XYZ.999 的第二阶段转换表,将中间代码页中的代码点转换为打印机代码页中的代码点。 c1 属性假设包含使打印机选择代码页 XYZ.999 的打印机命令字符串。
#include <piostruct.h>
#include <fcntl.h>
/*** Table to Translate Code Points for the Intermediate ***/
/*** Code Page to Code Points for a Printer Code Page ***/
struct transtab table[] = {
/* 00 (000) */ {CP}, {CP}, {CP}, {CP},
.
.
.
/* FC (252) */ {63}, {CP}, {94,1}, {SC} }; /*** Command Names for the Translate Table ***/
char cmdnames[][2] = {
{'c', '1'}, /* index 0 - select the code page */
{'e', 'b'} }; /* index 1 - next byte is graphic */ /*** Write the Table To a File (Error Processing Not Shown) ***/
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);
}代码点 252 处的 {63} 表示代码点 252 应该先转换为代码点 63,然后再发送至打印机。 代码点 253 处的 {CP} 表示代码点 253 应该不经转换直接发送到打印机。 代码点 254 处的 {94,1} 表示代码点 254 应该先转换为代码点 94,然后再发送至打印机。 {94,1} 中的 ,1 指示在发送代码点之前,应该将其 2 字符属性名位于 "命令名称" 数组中的索引 1 处的打印机命令字符串发送到打印机。 代码点 255 处的 SC 指示中间代码页中代码点 255 处的字符不能由此第二阶段转换表所描述的打印机代码页来打印。