我想打印正确的unicode(让我们说希腊字符),但我有问题。例如:
PrintStream oStream = new PrintStream(client.getOutputStream(), true, "UTF-8");
oStream.write(" Customer : Γειά σου\r\n".getBytes());
oStream.write(" ΚΩΔΙΚΟΣ : 00000234242\r\n".getBytes());
oStream.flush();
oStream.close();
OR
OutputStreamWriter oStream = new OutputStreamWriter(client.getOutputStream(), "UTF-16");
oStream.write(" Customer : Γειά σου\r\n");
oStream.write(" ΚΩΔΙΚΟΣ : 00000234242\r\n");
oStream.flush();
oStream.close();
问题是,是否有任何解决方案可以正确打印所有字符。我认为希腊字符UTF-16还可以。
答案 0 :(得分:3)
这很可能是个问题:
oStream.write(" Customer : Γειά σου\r\n".getBytes());
oStream.write(" ΚΩΔΙΚΟΣ : 00000234242\r\n".getBytes());
您在没有编码的情况下调用String.getBytes()
,使用平台默认编码获取字节数组。无论如何,这几乎总是一个坏主意,和这意味着你之前指定UTF-8的事实与这两行无关。到PrintStream
获取数据时,它已经是二进制数据。
请改为尝试:
oStream.print(" Customer : Γειά σου\r\n");
oStream.print(" ΚΩΔΙΚΟΣ : 00000234242\r\n");
注意:
PrintStream
或PrintWriter
。他们吞下了例外。Writer
子类而不是OutputStream
子类我建议你将输出流包装在OutputStreamWriter
...中,这将允许你指定编码,你不必担心意外写二进制数据(因为API不允许它并且你不会看到被吞下的异常。
答案 1 :(得分:0)
永远不要依赖默认编码,如果你想坚持创建一个字节数组的多余方式来打印,那就更好地总是指定了,而不是更加优雅,直观,以各种方式直接使用String的优越方式...
oStream.write(" Customer : Γειά σου\r\n".getBytes("UTF-8"));
oStream.write(" ΚΩΔΙΚΟΣ : 00000234242\r\n".getBytes("UTF-8"));
来自OP的评论
客户端是输出流&更具体的一个套接字,用于将结果输出到打印机
这可能是一个问题!我不相信打印机能够正确获取UTF-8普通字符串。一定要用普通的ASCII字符串进行测试,以确保其他一切正常。
修改强>
来自PDL Reference Guide for the Xerox WorkCentre/WorkCentre Pro Series:
本文档不是PS或PCL参考手册,而是PS,PCL 或ASCII 打印作业中使用扩展功能WorkCentre的指南。
在任何地方都没有提到过UTF-8 ......
从此doc at SAP: Xerox_SAP_Device_Types
要启用Xerox®打印机进行Unicode打印,请获取支持UTF-8字符集的型号的Unicode打印解决方案,其中提供了一个名为Xerox®InternationalUnicode Printing的可选套件。
这听起来不太好......