【问题标题】:Why does encode not work? (UTF-8, String, Java)为什么编码不起作用? (UTF-8、字符串、Java)
【发布时间】:2015-02-05 09:21:20
【问题描述】:

我正在使用执行命令

Runtime.getRuntime().exec("ping google.de"); 

这将返回一个进程,我从中获取输入流。然后我初始化一个 BuffredReader

BufferedReader(new InputStreamReader(processInputStream, "UTF-8"));

如果我愿意

System.out.println(reader.readLine()); // The returned String of readLine()
// is used to create a javafx.scene.text.Text in my application

它将打印“?”而不是像“ü”、“ä”或“ö”这样的字符
所以句子“这个字符 - ä - 不会工作”被编码为“这个字符 - ? - 不会工作”
如何正确编码这些东西?

谢谢,巴斯蒂
ps:是的,我知道这个问题已经被问过几次了,但是我找不到可以解决我的问题的线程

【问题讨论】:

  • 这是你打印的目标,它搞砸了。如果您打印的每个字符都显示一个问号,则多字节 UTF-8 代码已正确解码为单个字符。
  • 目标是什么意思? idk 发生错误编码的地方。进程的输入流只会流式传输字节。然后 inputstreamreader 应该将它们编码为 uft-8,但事实并非如此。 BufferedReader 只返回字符,直到找到系统行分隔符。是 inputstreamreader 失败了吗?
  • @McDowell 我调试了我的阅读方法并且 readLine() 已经返回了一个包含“?”的字符串。它不是 println()
  • @Basti:您使用的是什么操作系统?视窗? Linux? macOS?
  • @Codo 我在 Windows 上工作。但如您所见,我没有使用默认字符集来编码输入流的字节。我将其设置为 UTF-8。所以我的程序在哪个操作系统上运行应该没有关系,不是吗?

标签: java string character-encoding inputstream


【解决方案1】:

InputStreamReader 的编码指定传入字节流的编码,以便可以正确地将其转换为独立于编码的 Java String 实例。因此它必须与执行命令的命令行环境的编码相匹配。在您的情况下,它是您的 Windows 命令外壳的编码。

根据我的经验,Windows 环境中的正确编码可能是“CP850”。

BufferedReader(new InputStreamReader(processInputStream, "CP850"));

【讨论】:

  • 我可以使用 System.setProperty("file.encoding", "UTF-8"); 来解决这个问题吗? ?
  • 如果我使用 Charset.defaultCharset() 作为我的编码字符集,它也不起作用。还是'?'
  • 它是否适用于“CP850”? System.setProperty() 无济于事,因为它设置了 Java 环境的编码,而不是 Windows shell 的编码。 Charset.defaultCharset() 也不起作用,因为它查询 Java 环境的编码,这通常与底层操作系统的编码相同。但是 Windows 上的命令行 shell 还有另一种编码。
  • 我没有测试 cp850,因为我正在寻找一个可行的解决方案,无论我的应用程序在哪个操作系统上运行
  • 这恐怕是Java的操作独立性结束的一个领域。我怀疑您是否可以找到无需检查操作系统组即可工作的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-17
  • 2021-12-17
  • 2016-11-14
  • 2011-08-09
  • 2012-08-03
  • 2014-06-21
相关资源
最近更新 更多