我正在尝试使用 c++ 中的 writePrinter 方法将亚洲语言字符打印到行式打印机(EPSON LQ-2090)。
ANSI 字符打印得很好,但是当我向它扔亚洲语言字符时,它们就像垃圾一样出来。
请注意,如果我将 DocInfo 数据类型参数更改为“TEXT”而不是“RAW”,那么亚洲语言字符也不会打印。
有没有办法让亚洲语言或 Unicode 字符正确打印?
当您使用 WritePrinter() 时,您绕过打印机驱动程序并将打印命令直接写入打印机。这通常会使这类点阵打印机的输出速度更快。但是您会错过 Windows 内置的渲染任意字体的支持。您将改用打印机固件中内置的字体。它们通常非常谦虚,仅支持几种样式的西方字形。并且需要特殊的转义命令才能激活。
您需要打印机的编程手册来了解如何切换字体。如果固件不支持您需要的字形,那么您将返回将打印机置于图形而不是文本模式。让它像打印机驱动程序一样慢,生成图形绘图命令更令人头疼。
像垃圾一样打印亚洲语言字符是一个编码问题,我使用的是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* 缓冲区 '\xd6\xd0\xce\xc4'。
您需要了解EPSON LQ-2090支持哪些编码,不同地区和国家销售的打印机可能有不同的内置编码,希望对您有用。
我的经验是 WritePrinter 没有绕过打印机驱动程序,因为如果您安装了错误的驱动程序,打印机就会出现意外行为。