【问题标题】:How to print UTF8 when running code with java -jar使用 java -jar 运行代码时如何打印 UTF8
【发布时间】:2016-03-31 03:37:08
【问题描述】:

我正在编写一个解析 UTF-8 编码文件的项目。

我是这样做的

ArrayList<String> al = new ArrayList<>();
BufferedReader bufferedReader = new BufferedReader(new         
                                InputStreamReader(new FileInputStream(filename),"UTF8"));

String line = null;

while ((line = bufferedReader.readLine()) != null)
{

    al.add(line);
}

return al;

奇怪的是,当我在 IntelliJ 中运行它时,它会正确读取文件,但当我通过 java -jar 运行它时却没有(它给我的是垃圾值而不是 UTF8)。

我能做什么

  1. 在与 intelliJ 相同的环境中通过 java -jar 运行我的 Java 或
  2. 修复我的代码,使其将 UTF-8 读入字符串

【问题讨论】:

  • 您的打印代码看起来如何?我的意思是告诉你值是垃圾的代码,它打印al
  • @SabirKhan System.out.println(line);
  • File 已过时。您可以使用 Files.readAllLines(Paths.get(filename), StandardCharsets.UTF_8) 为您完成所有工作。
  • 我猜,它不应该是UTF8,而是UTF-8UTF-8 是跨平台标准化的,而 UTF8 不是。
  • 我同意@SabirKhan。您应该使用接受CharSet 而不是StringInputStreamReader ctor,尽管我不确定这是否是 OP 所说的差异的原因。

标签: java utf-8


【解决方案1】:

我认为这里发生的事情是您没有正确设置终端以进行默认编码。基本上,如果您的程序运行正确,那么它会抓取 UTF-8 字节,将它们存储为 Java 字符串,然后 outputting them to the terminal in whatever the default encoding scheme 就是。要了解您的默认编码方案,请参阅this question。然后,您需要确保运行 java -jar 命令的终端与其兼容。例如,在我的 Mac 上查看我的终端设置/首选项。

【讨论】:

  • 想象一下您要交付给客户的软件。您的软件有一个错误 - 它在输出流中打印出难以理解的字符。但是,不是直接在您的软件中修复它(就像我在回答中建议的那样),您发布了一个公共说明,告诉您的客户更改他们的终端设置。如果某些客户端运行没有 GUI 的系统怎么办?他们如何更改那里的设置?您会发布一份公开说明,描述如何更改每个可能平台的设置吗?对我来说似乎不是解决方案。
  • 我想我的意思是您的代码中可能没有错误。假设代码运行,您上面的代码的 sn-p 应该在字符串中正确读取和存储 UTF-8 字符。我猜你只是在做System.out.println()。你究竟是如何输出这些数据的?
  • 除了它也不正确输出到文件
  • Charles,假设您在输出到文件时和在终端中遇到同样的问题,当您运行命令cat foo.txt | xxd 时会发生什么,以及您在哪些特殊的 UTF-8 字符那个文件?基本上,我怀疑代码没问题,但是您用来查看这些 UTF-8 字符的任何 UI 都没有正确配置。
  • @Nordenheim - 不,恰恰相反; entpnerd 有一个很好的解决方案——人们应该编写他们的代码,使其与环境无关,并允许 JVM 根据环境计算出正确的编码。另一方面,您建议将输入修复为 UTF-8。当用户将文件保存为“cp1252”或者我的文件保存为“cp1252”时,这将如何在 Windows 上工作,而我的 localeen_GB.ISO8859-1 和我的终端中的编码要匹配。 entpnerd 强调了人们的终端(终端、iTerm、Putty 等)与语言环境不匹配的常见情况。
【解决方案2】:

Oracle 文档对Charset 给出了非常直接的答案:

标准字符集

Java 平台的每个实现都需要支持以下标准字符集。请查阅您的实现的发布文档以查看是否支持任何其他字符集。此类可选字符集的行为可能因实现而异。

...

UTF-8

八位 UCS 转换格式

所以你应该使用new InputStreamReader(new FileInputStream(filename),"UTF-8"));

【讨论】:

  • 我也想过这个问题,但如果是这样的话,InputStreamReader 构造函数会抛出一个UnsupportedEncodingException
  • 是的。他使用的是字符串构造函数,而不是字符集构造函数:docs.oracle.com/javase/7/docs/api/java/io/…
  • @entpnerd 是的,我看错了,这就是我删除评论的原因。事情可能是 OP 捕获异常并默默地丢弃它们,谁知道
  • 这个答案与 OP 的问题有何不同?
猜你喜欢
  • 2018-05-02
  • 2018-08-10
  • 1970-01-01
  • 2019-04-08
  • 1970-01-01
  • 2016-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多