设置字符代码表以在ESC / POS打印机中打印非拉丁字符

时间:2018-05-04 11:01:17

标签: java android printing escpos

我有一个Android应用程序,我正在尝试打印一些包含非拉丁字符的文本。

我正在使用此代码向打印机发送ESC t n命令:

 byte[] buf = new byte[]{0x1B, 0x74, (byte)2}; // 2 is the codetable for PC850: Multilingual
 this.mBaseOutputStream.write(buf);

然后,我尝试打印我的代码:

this.mBaseOutputStream.write("Лорем ăîîîîîîă".getBytes("cp850"));

但我得到的所有非拉丁字符都是奇怪的符号。 那么我做错了什么?

2 个答案:

答案 0 :(得分:3)

不确定这是一个答案,但希望这会让事情开始。还需要一点空间来解释......

看起来代码页850没有所需的字符。离线检查的一种简单方法是转换回String。例如。 :

System.out.println(
        new String("Лорем ăîîîîîîă".getBytes("cp850"), "cp850"));
--> ????? ?îîîîîî?

显然,只有î可用。

您可能需要使用其他代码页进行一些实验 - 这是什么类型的打印机?

这里的几个测试表明示例字符串可能需要多个代码页,但其他人可能更清楚:

System.out.println(
        new String("Лорем ăîîîîîîă".getBytes("cp852"), "cp852"));
--> ????? ăîîîîîîă
System.out.println(
        new String("Лорем ăîîîîîîă".getBytes("cp855"), "cp855"));
--> Лорем ????????

答案 1 :(得分:0)

首先发送初始化字节( a.k.a write(); flush(); ),而不是一起发送所有数据。然后发送你的角色。

public void print (String text, String codePage, OutputStream os) 
{
    /*Your codetable initialization here.
     *You can refactor this more efficiently.
     *Hardcoded just so you can understand.
     */
    ByteBuffer init = ByteBuffer.allocate(3);
    init.put((byte) 0x1B);
    init.put((byte) 0x74);
    init.put((byte) 2);
    sendData(init.array(), os);

    ByteBuffer dataToPrint = ByteBuffer.allocate(text.length());
    dataToPrint.put(text.getBytes(codePage));
    sendData(dataToPrint.array(), os);
}

private void sendData(byte[] buffer, OutputStream os) throws IOException
{
    try {
        ByteBuffer byteBuffer = ByteBuffer.wrap(buffer);
        os.write(byteBuffer.array());
        os.flush();
        // tell the user data were sent

    } catch (Exception e) {
        e.printStackTrace();
    }
}

您可以将其用作;

print("Лорем ăîîîîîîă", "cp852", yourOutputStream); // cp852 or any other codePage you desire.

如果不起作用,请在打印前尝试关闭多字节(欧洲区域的单字节)。

ByteBuffer closeMultibyte = ByteBuffer.allocate(2);
closeMultibyte.put((byte) 0x1C);
closeMultibyte.put((byte) 0x2E);
sendData(closeMultibyte.array(), os);