1

我想正确打印 unicode(比如说 greek characters),但我遇到了问题。例如 :

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 是可以的。

4

2 回答 2

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

笔记:

  • 我建议不要使用PrintStreamor PrintWriter。他们吞下异常。
  • 如果你只写文本,你应该使用Writer子类而不是OutputStream子类
  • 目前还不清楚您的源代码是否被正确处理:您需要检查您用于编译代码的任何内容是否知道您的源文件正在使用什么编码。

我建议您将输出流包装在一个OutputStreamWriter... 中,这将允许您指定编码,您不必担心意外写入二进制数据(因为 API 不允许这样做)并且您不会看到异常被吞没。

于 2013-10-08T15:20:06.267 回答
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 特定问题

来自Xerox WorkCentre/WorkCentre Pro 系列的 PDL 参考指南

本文档并非 PS 或 PCL 参考手册,而是在 PS、PCL或 ASCII打印作业中使用 WorkCentre 的扩展功能的指南。

任何地方都没有提到UTF-8......

来自 SAP 的此文档:Xerox_SAP_Device_Types

要启用 Xerox® 打印机进行 Unicode 打印,请为支持 UTF-8 字符集的型号获取 Unicode 打印解决方案,其中提供了一个名为 Xerox® International Unicode Printing 的可选套件。

这听起来不太好...

于 2013-10-08T15:19:59.873 回答