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

时间:2013-10-08 15:16:16

标签: java unicode printing 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 个答案:

答案 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");

注意:

  • 我建议不要使用PrintStreamPrintWriter。他们吞下了例外。
  • 如果您只是在编写文本,则应使用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字符串进行测试,以确保其他一切正常。

修改

Xerox WorkCentre 24 PCL特定问题

来自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的可选套件。

这听起来不太好......