我想正确打印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是可以的。
这很可能是问题所在:
oStream.write(" Customer : Γειά σου\r\n".getBytes());
oStream.write(" ΚΩΔΙΚΟΣ : 00000234242\r\n".getBytes());
您正在调用字符串.getBytes()
而不进行编码,以使用平台默认编码获取字节数组。无论如何,这几乎总是一个坏主意,这意味着您之前指定了UTF-8的事实与这两行无关。当打印流
获取数据时,它已经是二进制的。
试试这个:
oStream.print(" Customer : Γειά σου\r\n");
oStream.print(" ΚΩΔΙΚΟΣ : 00000234242\r\n");
注意:
PrintStream或PrintWriter。他们接受例外
Writer
子类,而不是OutputStream
子类我建议您将输出流包装在一个OutputStreamWriter
…中,这样您就可以指定编码,您不必担心意外写入二进制数据(因为API不允许),也不会看到异常被吞没。
永远不要依赖默认编码,最好总是指定,如果您想坚持使用创建字节数组的冗余方式来打印,而不是更优雅、更直观、更优越的直接使用字符串的方式...
oStream.write(" Customer : Γειά σου\r\n".getBytes("UTF-8"));
oStream.write(" ΚΩΔΙΚΟΣ : 00000234242\r\n".getBytes("UTF-8"));
来自OP的评论
客户端是输出流
这可能是个问题!我不相信打印机能正确获取UTF-8纯字符串。一定要用纯ASCII字符串对其进行测试,以确保其他一切正常。
编辑
从Xerox WorkCentre/WorkCentre Pro系列的PDL参考指南:
本文档并非PS或PCL参考手册,而是在PS、PCL或ASCII打印作业中使用WorkCentre扩展功能的指南。
任何地方都没有提到UTF-8…
来自SAP的此文档:Xerox_SAP_Device_Types
要启用Xerox®打印机进行Unicode打印,请获取支持UTF-8字符集的型号的Unicode打印解决方案,其中有一个可选套件,称为Xeroxs®International Unicode printing。
这听起来不太好…