1

我有一个名为 theProperties.properties 编码为 UTF-8 的属性文件:

property1=Some Chinese Characters: 会意字會意字
property2=More chinese Char - 假借
property2=<any other valid UTF-8 characters>

我使用资源包来提取本地化字符串:

ResourceBundle localizedStrings = ResourceBundle.getBundle(
    "theProperties.properties",
    locale
);

资源包假定所有字符串都在 ISO-8859-1 中,我的资源文件被编码为 UTF-8。我需要将字符串转换为 UTF-8

像这样包装资源包并从中拉出字符串是否安全:

public String getLocalizedString(String key){
    String localizedString_ISO_8859_1 = localizedStrings.getString(key);
    String localizedString_UTF_8 = new String(localizedString_ISO_8859_1.getBytes("ISO-8859-1"), "UTF-8");
    return localizedString_UTF_8;
}

这段代码是否存在不安全的情况?感觉它可能不安全但字符串是不可变的,这是否意味着下面的字节也是不可变的?

还有其他方法可以做到这一点,但这种方法更短,所以如果它是安全的,我更愿意使用它。


这是解决这个问题的另一种方法,但它有点长,从易于阅读的角度来看,我更喜欢上面的方法,因为这个解决方案只改变了 Control 类中的一行。

4

3 回答 3

0

这应该可行,虽然完全丑陋,因为弯曲所有需要大评论的东西。

它的工作原理是:

  • Java 将 UTF-8 多字节字符串的每个字节都视为 char。
  • 将该字符串转换为 ISO-8859-x 字节使每个 char 成为一个字节。
  • 将这些字节解释为 UTF-8 会产生正确的解释。

如果您有像maven这样的构建基础架构,则可以使用插件将编码从 src 转换为构建目录。

还有带有所见即所得编辑的 .properties 编辑器。

最干净的可能可能会编写您自己的ListResourceBundle孩子或类似的东西。根本不(ab)使用.properties。有关示例用法,请参见 JRE。

于 2013-12-02T18:50:59.570 回答
0

它应该按照您的方式工作,原因如下:

当 Java 读取和解释属性文件的字节时,它只会使用无符号字节值作为 char 值——这是可行的,因为幸运的是,前 256 个代码点在 Unicode 中具有相同的编码,并且由于字符串在内部存储为UTF-16,不需要代理字符或其他复杂的东西。因此,假装它是 ISO-8859 的字节之间的转换不会丢失。

于 2013-12-02T18:51:16.130 回答
0

这很好,因为 ISO-8859-1 在字节和它的字符集之间有一个一对一的映射。

任何时候你需要 abyte[]但你不得不使用 a String,你应该使用 ISO-8859-1 作为映射,这是最快的,因为它本质上是恒等映射。

于 2013-12-02T19:26:17.503 回答