【问题标题】:Japanese text in Java .properties fileJava .properties 文件中的日文文本
【发布时间】:2011-12-07 14:11:47
【问题描述】:

我正在尝试使用代码从 .properties 文件中读取日语字符串值:

Properties properties = new Properties();
InputStream in = MyClass.class.getResourceAsStream(fileName);
properties.load(in);

问题显然是上面的代码无法识别文件的编码。它只读取英文部分并用问号替换日文字符。顺便说一句,在 Swing 中显示日文文本或在编辑器中读/写 UTF-8 编码的 .properties 文件时,这不是问题。这两件事都有效。

Properties 类编码不知道吗?是否有不违反通常在小程序中找到的安全管理器设置的编码感知替代方案?

【问题讨论】:

  • 您在控制台上看到了吗(只读取英文部分并用问号替换日文字符)?

标签: java unicode encoding properties


【解决方案1】:

在我看来,您必须将日文字符转换为 java Unicode 转义字符串

例如,这就是我对越南语所做的方式

Currency_Converter = Chuyen doi tien te  

Enter_Amount = Nh\u1eadp v\u00e0o s\u1ed1 l\u01b0\u1ee3ng  

Source_Currency = \u0110\u01a1n v\u1ecb g\u1ed1c  

Target_Currency = \u0110\u01a1n v\u1ecb chuy\u1ec3n  

Converted_Amount = K\u1ebft qu\u1ea3  

Convert = Chuy\u1ec3n \u0111\u1ed5i  

Alert_Mess = Vui l\u00f2ng nh\u1eadp m\u1ed9t s\u1ed1 h\u1ee3p l\u1ec7  

Alert_Title = Thong bao  

【讨论】:

  • @butchi 你好,当我在 Messages_vi_VN.properties 文件中输入时,每个键输入到文件:像那样转换 = Chuy\u1ec3n\u0111\u1ed5i。但我只想用越南语输入和显示。
【解决方案2】:

load 需要 ISO 8859-1 编码,如 noted in the docs

一般来说,您会希望使用native2ascii 来转换属性文件、使用阅读器加载或使用可以指定编码的 XML。

【讨论】:

  • +1。我认为使用阅读器加载最简单:将properties.load(in) 替换为properties.load(new InputStreamReader(in, "UTF-8"))(或您使用的任何编码)。
  • 感谢 Eli,添加 InputStreamReader 确实是最简单的解决方案,对原始代码的改动最小。
  • Dave 的 native2ascii.exe 解决方案确实有效,但每当编辑 .properties 文件时,它都会增加一项操作,并且除了 .properties 文件之外还需要保留原始文件。正如建议的那样,使用阅读器更简单。我觉得 XML 在这种情况下不实用,因为在手动编辑 .properties 文件时增加了引入错误的机会,而且代码本身可能比上述替代方案更复杂。
  • @esav1953 这就是我提供三个主要选项的原因,在许多或大多数情况下,使用阅读器是一个不错的选择,尽管您的推理有点不对劲。转换过程是构建过程的一部分;额外的步骤消失了——属性文件是一个构建工件。使用 XML 并没有显着(或任何)困难。
【解决方案3】:

可以从属性文件中读取任何语言,你应该做的只是从属性文件中按键获取值,然后创建一个新字符串new String(keyValue.getBytes("ISO-8859-1"), "UTF-8"),即它会为你创建一个UTF-8字符串.

public static String getLocalizedPropertyValue(String fileName, String key, Locale locale) throws UnsupportedEncodingException {
    Properties props = getPropertiesByLocale(fileName, locale);
    String keyValue = props.getProperty(key);
    return keyValue != null ? new String(keyValue.getBytes("ISO-8859-1"), "UTF-8") : "";
}

【讨论】:

    【解决方案4】:

    您考虑过使用ResourceBundle 吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多