5

我有一个 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"));

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

4

2 回答 2

5

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

看起来代码页 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"));
--> Лорем ????????
于 2018-05-07T14:10:27.047 回答
0

首先发送初始化字节(又名 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);
于 2018-05-10T09:01:26.670 回答