当前位置: 首页 > 知识库问答 >
问题:

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

楚元章
2023-03-14

我想正确打印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个答案

窦彦君
2023-03-14

永远不要依赖默认编码,最好总是指定,如果您想坚持使用创建字节数组的冗余方式来打印,而不是更优雅、更直观、更优越的直接使用字符串的方式...

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。

这听起来不太好…

段兴为
2023-03-14

这很可能是问题所在:

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不允许),也不会看到异常被吞没。

 类似资料:
  • 我有一个数据库,它存储带有Unicode字符的视频游戏名称,但我不知道如何在将这些Unicode字符打印到超文本标记语言响应时正确转义它们。 例如,当我打印所有名为Uncharted的游戏时,我会得到以下信息: 但它应该显示以下内容: 我运行了一个快速的JavaScript转义函数,查看哪个Unicode字符™并发现它是。 如果我能得到字符以正确显示。我的猜测是以某种方式找到字符串中每个字符的十六

  • 我目前的logClass有一个问题,无法打印umlauts“üäß”,我创建这个命令是为了将控制台上的每个字符串打印到JTextPane。 我已经在方法“控制台”上将PrintStream设置为使用“UTF-8”,并且我已经尝试了不同的字体,但是在尝试打印特殊字符时,我总是会出现错误字符。有人会对如何解决这个问题提出建议吗? 这是我的代码:

  • 问题内容: 例如,如何转换字符串。我从网站获得的字符串,未在中进行编码。它工作在计划只是罚款使用Swing( ),但是当我过去的链接罐子Windows控制台(要运行的应用程序),它不显示在字符串中正确的字符的字符和。 我从网站上得到那串 。如何在Swing应用程序中进行编码或显示,因此当我运行应用程序时,它将向我显示此字符(以及课程的其他unicode字符(“Ž”,“ž”,“č”和“Š”) )?

  • 问题内容: 我有一个已编码为UTF-8的俄语字符串 当我在Eclipse控制台中打印字符串时,我得到有人可以建议如何将俄语字符串打印到控制台,或者我在这里做错了什么? 我尝试过使用它将其转换为字节,然后仍然是同样的问题:-( 问题答案: 试试这个: 或这个: 俄语的主要问题是正确设置UTF-8编码。

  • 问题内容: 我正在使用BeautifulSoup从HTML提取一些文本,但是我只是想不出如何正确地将其打印到屏幕(或与此相关的文件)上。 这是我的包含文本的类的样子: 当尝试打印一个实例时,这是我在控制台上看到的: 无论我尝试什么,都无法获得想要的输出(上面的文本应该是希伯来语)。我的最终目标是序列化到文件(使用json或pickle)并能够将其读回。 我在Ubuntu 10.10上使用Pytho

  • 我正在评估与thymeleaf模板引擎的Spring启动。我正面临UTF8字符表单张贴问题。 对于最简单的post示例: 在控制器中: 在本例中,Spring MVC(或thymeleaf)无法正确编码具有UTF-8字符的表单。 如果我输入,我将看到以下日志: 应编码为。正文应该是,但我不知道为什么它会变成,并被解码成错误的字符。 我在谷歌上搜索并找到了一些解决方案,比如添加一个编码过滤器: 但不