You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 10:33:08