我有一个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"));
但我得到的所有非拉丁字符都是奇怪的符号。 那么我做错了什么?
答案 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);