使用WritePrinter API将中文字符打印到行式打印机

时间:2013-07-11 11:23:01

标签: c++ winapi character

我正在尝试使用c ++中的writePrinter方法将亚洲语言字符打印到行式打印机(EPSON LQ-2090)。

ANSI字符打印正常,但是当我在其中抛出亚洲语言字符时,它们会像垃圾一样出现。

请注意,如果我将DocInfo数据类型参数更改为“TEXT”而不是“RAW”,那么也不会打印亚洲语言字符。

有没有办法让亚洲语言或Unicode字符正确打印?

2 个答案:

答案 0 :(得分:3)

使用WritePrinter()时,绕过打印机驱动程序并将打印命令直接写入打印机。这通常会使这类点阵式打印机的输出更快 lot 。但是你会错过Windows内置的支持来渲染任意字体。您将使用打印机固件中内置的字体。这通常非常适度,只支持几种风格的西方字形。并且需要特殊的转义命令来激活。

您需要打印机的编程手册才能找到如何切换字体。如果固件不支持您需要的字形,那么您将回到将打印机放入图形而不是文本模式。使它像打印机驱动程序一样慢,因为生成图形绘制命令会让人头疼。

答案 1 :(得分:0)

打印像垃圾这样的亚洲语言字符是一个编码问题,我使用EPSON LQ-1600KIIIH,它支持gbk原始缓冲区,正如你提到的WritePrinter需要LPVOID缓冲区,你需要做的是正确编码缓冲区,例如,使用qt QTextCodec将UTF-16流编码为gbk缓冲区,然后使用WritePrinter:

// Message to print contains chinese "中文" 
QString msg("\u4e2d\u6587")

// Encoding, from UTF-16 to GBK (my locale encoding)
QByteArray bmsg = QTextCodec::codecForLocale()->fromUnicode(msg);

// Write operation
WritePrinter( m_PrinterHandle,bmsg.data(), bmsg.size(), &dwBytesWritte );

bmsg.data()返回gbk编码char * buffer' \ xd6 \ xd0 \ xce \ xc4'。

您需要了解EPSON LQ-2090支持的编码方式,不同地区和国家/地区销售的打印机可能有不同的内置编码,希望对您有用。

我的经验是WritePrinter没有绕过打印机驱动程序,因为如果安装了错误的驱动程序,打印机会出现意外情况。

相关问题