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

Sunmi V2sPlus热敏InnerPrinter打印希腊字符显示未知符号问题

解决Sunmi V2sPlus热敏打印机希腊字符打印乱码问题

核心问题分析

你当前的代码仅做了编码转换,但未告知打印机切换到对应编码页解析字节,导致打印机无法识别发送的希腊字符编码,最终输出未知符号。同时编码转换步骤可简化,无需先转Unicode再二次转换。

修复方案

1. 发送ESC/POS指令切换编码页

Sunmi InnerPrinter遵循ESC/POS标准,需先发送指令ESC t n(0x1B 0x74 n)切换到希腊语对应编码页,其中n为编码页编号:

  • CP737(希腊语DOS编码):编号11(十六进制0x0B)
  • ISO-8859-7:编号16(十六进制0x10)

2. 简化编码转换逻辑

直接用目标编码将字符串转为字节数组,无需中间Unicode转换步骤。

修复后代码

try
{                
    using BluetoothSocket _socket = device.CreateRfcommSocketToServiceRecord(UUID.FromString("00001101-0000-1000-8000-00805f9b34fb"));
    System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
    await _socket.ConnectAsync();

    switch (input)
    {
        case "LF":
            _socket.OutputStream.WriteByte(0x0A);
            break;

        default:
            // 切换到CP737希腊语编码页(若无效可替换为ISO-8859-7的指令:new byte[] {0x1B, 0x74, 0x10})
            byte[] switchCodePage = new byte[] { 0x1B, 0x74, 0x0B };
            await _socket.OutputStream.WriteAsync(switchCodePage, 0, switchCodePage.Length);

            // 直接用CP737编码转换希腊字符
            var greekEncoding = Encoding.GetEncoding(737);
            byte[] message = greekEncoding.GetBytes(input);
            
            await _socket.OutputStream.WriteAsync(message, 0, message.Length);
            _socket.OutputStream.WriteByte(0x0A);
            break;
    }

    _socket.Close();
}
catch (Exception)
{
    throw;
}

调试建议

  • 若CP737无效,替换为ISO-8859-7的编码页指令和编码(Encoding.GetEncoding("ISO-8859-7"))
  • 确认input字符串本身是正确的希腊字符,无编码损坏
  • 优先参考Sunmi V2sPlus官方文档中指定的希腊语支持编码页

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 20:55:48