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

ESC/POS热敏打印机小字体下$打印为¥,能否强制输出指定字符

问题核心结论

这个小字体模式下$被打印为¥的问题属于固件级硬编码错误,无法通过标准ESC/POS配置指令关闭或修改。你提到该问题在商品官方宣传图中同样存在,足以证明是出厂烧录小字号字模时,ASCII码0x24(对应$)的字形数据被错误写为¥,属于公版廉价热敏机的常见出厂bug。这类设备几乎不开放字模修改、固件更新的用户入口,没有直接修复的可能。

可落地的替代方案

  • 临时兼容方案:小字体打印过程中遇到需要输出$的位置,先发送字体切换指令{27, 77, 0}切回大字体打印$,打印完成后再发送{27, 77, 1}切回小字体继续打印后续内容。该方案实现简单,缺点是同行内容内$字号和其他字符不一致。
  • 完美适配方案:使用ESC/POS标准自定义字符指令ESC &,提前将$对应的正确点阵数据写入打印机用户自定义字模库,覆盖0x24码位在小字体模式下的默认错误字形。该方案可保证全文字号统一,仅需要提前确认小字体对应的点阵规格(多数廉价机小字体为12*24点阵),提前生成对应点阵数据即可。

现有Java打印代码的问题修正

你当前通过new String(byte[])拼接控制指令、最后调用无参getBytes()生成打印数据的写法存在严重的编码隐患:Java字符串转码逻辑会修改非ASCII范围的控制字节,极易导致指令失效、字符乱码。
正确的实现方式是通过ByteArrayOutputStream直接拼接所有二进制指令和文本字节,全程避免字符串和字节的无意义转换,参考实现如下:

import java.io.ByteArrayOutputStream;
import java.nio.charset.StandardCharsets;
import javax.print.Doc;
import javax.print.DocFlavor;
import javax.print.DocPrintJob;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.SimpleDoc;
import javax.print.attribute.HashPrintServiceAttributeSet;
import javax.print.attribute.standard.PrinterName;

public class ThermalPrinterTest {
    private static final String PRINTER_NAME = "你的打印机名称";
    public static void main(String[] args) throws Exception {
        ByteArrayOutputStream printStream = new ByteArrayOutputStream();
        // 打印机初始化 ESC @
        printStream.write(new byte[]{27, 64});
        // 走纸2行 ESC e 2
        printStream.write(new byte[]{27, 101, 2});
        // 写入打印文本,字符集需和打印机默认配置匹配,多数国产廉价机默认使用GBK
        printStream.write("My text $".getBytes(StandardCharsets.GBK));
        // 走纸1行 ESC e 1
        printStream.write(new byte[]{27, 101, 1});
        // 走纸后切纸 GS V B 0
        printStream.write(new byte[]{29, 'V', 66, 0});

        byte[] printData = printStream.toByteArray();
        // 提交打印任务
        HashPrintServiceAttributeSet attrSet = new HashPrintServiceAttributeSet(new PrinterName(PRINTER_NAME, null));
        PrintService[] services = PrintServiceLookup.lookupPrintServices(null, attrSet);
        DocPrintJob job = services[0].createPrintJob();
        DocFlavor flavor = DocFlavor.BYTE_ARRAY.AUTOSENSE;
        Doc doc = new SimpleDoc(printData, flavor, null);
        job.print(doc, null);
    }
}

大字体正常显示$、小字体显示¥的热敏小票实拍图

内容的提问来源于stack exchange,提问作者CeePlusPlus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 13:33:23