使用WritePrinter API将汉字打印到行打印机 我试图用C++的WrreEdgRead方法在一个行式打印机(爱普生LQ-2090)上打印亚洲语言字符。

使用WritePrinter API将汉字打印到行打印机 我试图用C++的WrreEdgRead方法在一个行式打印机(爱普生LQ-2090)上打印亚洲语言字符。,c++,winapi,character,C++,Winapi,Character,ANSI字符打印得很好,但当我向它扔亚洲语言字符时,它们就像垃圾一样 请注意,如果我将DocInfo数据类型参数更改为“TEXT”而不是“RAW”,那么也不会打印亚洲语言字符 有没有办法让亚洲语言或Unicode字符正确打印?使用WritePrinter()时,您可以绕过打印机驱动程序,直接将打印命令写入打印机。这通常会使这种点阵打印机的输出速度更快。但是,您将错过内置于Windows中的对呈现任意字体的支持。您将使用内置在打印机固件中的字体。这通常是非常温和的,只支持西方铭文,只有一些样式。需

ANSI字符打印得很好,但当我向它扔亚洲语言字符时,它们就像垃圾一样

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

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

使用WritePrinter()时,您可以绕过打印机驱动程序,直接将打印命令写入打印机。这通常会使这种点阵打印机的输出速度更快。但是,您将错过内置于Windows中的对呈现任意字体的支持。您将使用内置在打印机固件中的字体。这通常是非常温和的,只支持西方铭文,只有一些样式。需要特殊的逃生命令才能启动


您需要打印机的编程手册来了解如何切换字体。如果固件不支持所需的图示符,则返回到将打印机置于图形模式而不是文本模式。与打印机驱动程序一样慢,生成图形绘图命令更麻烦。

像垃圾一样打印亚洲语言字符是一个编码问题,我使用的是EPSON LQ-1600KIIIH,它支持gbk原始缓冲区,正如您提到的WritePrint使用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 );
返回gbk编码字符*缓冲区'\xd6\xd0\xce\xc4'

您需要了解爱普生LQ-2090支持哪种编码,不同地区和国家销售的打印机可能有不同的内置编码,希望对您有用


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

标准C++没有函数写打印机,所以你可能想告诉/标签你使用的库/API。我猜你使用的是Windows API写的PRINTYSIS,它是Windows API。你怎么打印?哪个是源编码?预期的编码是什么?如何在这些编码之间进行转换?我只给writePrinter方法提供了一个wchar_t字符串。如果您看到writePrinter方法BOOL writePrinter的签名(在HANDLE hPrinter中,在LPVOID pBuf中,在DWORD cbBuf中,在LPDWORD pcwrite中);它以LPVOID类型的缓冲区作为打印数据。缓冲区char*或wchar\u t*的类型无关紧要。谢谢Hans Passant,这对我帮助很大。我需要在90秒内打印60行。这是一种要求,我认为如果我使用图形模式而不是文本模式是不可能的。有没有办法改变字体以便我可以打印亚洲文字?你能告诉我吗。除了writePrinter API,还有其他选择吗?这将不会绕过打印机驱动程序。我不想使用DrawTextExAPI。不,没有其他选择。我当然会在回答中提到这一点。