【问题标题】:java.util.Properties encodingjava.util.Properties 编码
【发布时间】:2016-04-15 14:10:57
【问题描述】:

我在两个不同的系统上得到不同的结果,不知道为什么。

Properties prop = new Properties();
prop.load(new ByteArrayInputStream(input)); //input is byte[]

在两个系统上输入都包含"var=\\u00C4\\u00DC\\u00D6\\u00E4\\u00FC\\u00F6"

在我的测试系统中,prop 包含 "var=ÄÜÖäüö"。 (这就是我想要的)

在另一个系统属性上包含"var=\xC4\xDC\xD6\xE4\xFC\xF6"。这是十六进制的input,但为什么Properties 会这样做?不幸的是,我对其他系统配置一无所知。

有人知道原因吗?

【问题讨论】:

  • 您应该尝试显示 ASCII 码。我的猜测是您在两个系统上具有相同的值,但由于平台的默认编码而无法渲染它。
  • 如何显示这些值?每个系统都不同吗?

标签: java


【解决方案1】:

Java .properties 文件使用ISO-8859-1 (Latin-1) 编码,而不是UTF-8。所有非拉丁 1 字符必须使用 Unicode 转义字符输入,例如\uHHHH.

另一种方法是对属性使用XML 格式,即UTF-8

Source: Javadoc

Also see this SO question

And this one

【讨论】:

  • 感谢斯图尔特的回答。我知道我的 byte[] 输入必须是 ISO-8859-1。例如,我使用“\\u00C4”而不是“Ä”。但是 prob.toString() 应该给我编码的值(“var=ÄÜÖäüö”)。但在外部系统上它是“var=\xC4\xDC\xD6\xE4\xFC\xF6”。我不知道为什么。
  • 要完成答案,我们可以注意到 Java 9 将对此进行更改。请参阅openjdk.java.net/jeps/226
  • @unknown 我认为您将不得不告诉我们一些系统之间的不同之处。 C4 肯定是正确的代码。 htmlhelp.com/reference/html40/entities/latin1.html
  • @Prim - 好吧,这不会让全球一百万开发人员感到头疼,对吗?许多人,尤其是在企业界,仍在使用 Java 7,甚至 6。
  • @Prim:这仅适用于 PropertyResourceBundle,一般不适用于属性文件;甚至 PropertyResourceBundle 也会退回到 ISO-8859-1。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-17
  • 2013-03-01
  • 2010-11-28
  • 1970-01-01
  • 1970-01-01
  • 2011-05-12
相关资源
最近更新 更多