提问者:小点点

PrintStream无法正确打印unicode字符(UTF-16)


我想正确打印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是可以的。


共2个答案

匿名用户

这很可能是问题所在:

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。

这听起来不太好…