Python win32print打印中文乱码求助(富士通FP2000打印机)
富士通FP2000打印机win32print中文打印乱码解决
问题背景
使用Python win32print 模块以RAW模式打印中文收据,核心代码如下:
printMethod = 'RAW' printer = win32print.OpenPrinter(self._printerName) win32print.StartDocPrinter(printer, 1, ('Automated printjob', None, 'RAW')) receipt = receipt.encode('big5') win32print.StartPagePrinter(printer) win32print.WritePrinter(printer, receipt) win32print.WritePrinter(printer, self._cmd.fullCut) win32print.EndPagePrinter(printer) win32print.EndDocPrinter(printer) win32print.ClosePrinter(printer)
尝试utf-8、gb18030、big5编码均出现乱码:
gb18030/big5编码打印:输出类似竖向拉伸的韩文utf-8编码打印:出现变异字母(如AE组合、带尾巴的o等)
打印机为富士通FP2000,官方文档标注支持gb18030和big5,且通过记事本可正常打印中文,确认设备支持中文打印。另外,utf-8编码字符串写入.txt文件可正常显示中文,但gb18030/big5编码写入文件会乱码。
排查与解决步骤
1. 手动切换打印机字符集
RAW模式是直接发送字节流给打印机,而记事本打印是通过Windows驱动自动处理了字符集切换。富士通FP2000需要先发送指令切换到对应中文字符集,再发送编码后的内容:
- 切换到GB18030字符集:发送初始化指令
\x1B\x40+ 字符集切换指令\x1C\x26\x47\x31 - 切换到Big5字符集:发送初始化指令
\x1B\x40+ 字符集切换指令\x1C\x26\x42\x31
修改后的示例代码(以GB18030为例):
printMethod = 'RAW' printer = win32print.OpenPrinter(self._printerName) win32print.StartDocPrinter(printer, 1, ('Automated printjob', None, 'RAW')) win32print.StartPagePrinter(printer) # 重置打印机+切换到GB18030字符集 win32print.WritePrinter(printer, b'\x1B\x40\x1C\x26\x47\x31') # 将Unicode字符串编码为GB18030字节流 receipt_bytes = receipt.encode('gb18030') win32print.WritePrinter(printer, receipt_bytes) win32print.WritePrinter(printer, self._cmd.fullCut) win32print.EndPagePrinter(printer) win32print.EndDocPrinter(printer) win32print.ClosePrinter(printer)
2. 确认源字符串的编码正确性
确保receipt本身是正确的Unicode字符串:
- 如果是从文件读取,需用对应编码打开(比如原文件是GB18030编码,就用
open('file.txt', encoding='gb18030')读取) - 如果是数据库获取,需确认数据库连接的编码设置,避免读取时出现转码错误
3. 单字符测试定位问题
先打印单个中文字符(比如'测'),配合字符集切换指令测试,确认是字符集切换无效还是编码转换错误:
# 测试GB18030单字符 test_char = '测'.encode('gb18030') win32print.WritePrinter(printer, b'\x1B\x40\x1C\x26\x47\x31') win32print.WritePrinter(printer, test_char)
4. 核对打印机指令集
如果切换指令无效,务必核对富士通FP2000的官方AT指令手册,不同型号的字符集切换指令可能存在差异,确保指令字节完全匹配。
额外注意事项
- 切纸指令
self._cmd.fullCut的字节编码需和当前字符集兼容,避免干扰字符解析 - 每次打印前发送初始化指令
\x1B\x40,清除打印机之前的状态缓存
内容的提问来源于stack exchange,提问作者jspoh
相关产品推荐
相关产品推荐

