对于开发我正在使用ResourceBundle
直接从IDE中的resources-directory读取UTF-8编码的属性文件(我在Eclipse的文件属性中设置该文件)(使用native2ascii)在去生产的路上),例如:
menu.file.open.label=&Öffnen...
label.btn.add.name=&Hinzufügen
label.btn.remove.name=&Löschen
由于这会导致使用非ASCII字符时出现字符编码问题,我认为我很满意:
ResourceBundle resourceBundle = ResourceBundle.getBundle("messages", Locale.getDefault());
String value = resourceBundle.getString(key);
value = new String(value.getBytes(), "UTF-8");
嗯,对于小写的德语变音符号它确实很好用,但对于大写的变音符号则不行,ß
也不起作用。以下是使用getString(key)
读取的值和使用new String(value.getBytes(), "UTF-8")
转换后的值:
&Löschen => &Löschen
&Hinzufügen => &Hinzufügen
&Ã?ber => &??ber
&SchlieÃ?en => &Schlie??en
&Ã?ffnen... => &??ffnen...
最后三个应该是:
&Ã?ber => &Über
&SchlieÃ?en => &Schließen
&Ã?ffnen... => &Öffnen...
我想我离真相并不太远,但我在这里错过了什么?
Google找到了something similar,但仍然没有答案。
编辑:多一点代码
答案 0 :(得分:6)
问题是你在没有指定编码的情况下调用String.getBytes()
- 这将使用默认的平台编码。然后,您将使用该操作的二进制结果,就像它是UTF-8一样。
如果您在两个方向都使用UTF-8,那就没关系了:
// Should be a round-trip
value = new String(value.getBytes("UTF-8"), "UTF-8");
...但是如果您尝试使用它来读取UTF-8编码的属性文件而不告诉正在执行初始读取的代码,那将无效。
您提供的代码基本上总是错误的方法。你的“因为这导致了字符编码的问题”表明你已经遇到过早期的问题 - 所以我会回到那个,而不是试图应用一个破解的修复。如果您在构建ResourceBundle
时已经丢失了数据,那么以后再回来就太晚了......您需要确保ResourceBundle
本身已正确加载。
请告诉我们完全您对ResourceBundle
有什么问题,我们可以看看是否可以解决根本问题。
编辑:目前尚不清楚你是如何运行native2ascii的。修复可能就像更改使用一样简单:
native2ascii -encoding UTF-8 input.properties output.properties
答案 1 :(得分:3)
一些注意事项:
String
它是UTF-16而不是它是一个损坏的字符串(并且修复得太晚了。)new String(value.getBytes(), "UTF-8");
- 此代码(最好)在使用UTF-8作为默认编码的系统上不执行任何操作;否则会破坏字符串。Properties
类型支持其他格式和编码,但我不知道你会如何告诉ResourceBundle
。)System.out
可以引入自己的转码错误(PrintStream
将UTF-16字符串编码为默认编码;接收设备必须使用相同的编码对字节进行解码。)我怀疑你是想在错误的地方解决你的问题。
答案 2 :(得分:2)
您使用与正在解码的编码不同的编码对文本进行编码。
请尝试使用相同的字符集进行编码和解码。
value = new String(value.getBytes("UTF-8"), "UTF-8");
String s = "ßßßßß";
s += s.toUpperCase();
s = new String(s.getBytes("UTF-8"), "UTF-8");
System.out.println(s);
打印
ßßßßßSSSSSSSSSS
答案 3 :(得分:0)
今天我和我的一位同事交谈,他几乎和其他答案提到的一样。所以我试图实现Jon Skeet所提到的,意味着创建与生产中相同的文件。由于每次更改资源后重建项目都是不可能的,我没有做任何解决这个问题的事情(我想这对某些人来说是新的)让我把它排除在外(即使它可能只是为了个人参考;))。简而言之,它使用Eclipse的项目构建器。
创建Ant样式的build.xml
<?xml version="1.0" encoding="UTF-8"?>
<project>
<property name="dir.resources" value="src/main/resources" />
<property name="dir.target" value="bin/main" />
<target name="native-to-ascii">
<delete dir="${dir.target}" includes="**/*.properties" />
<native2ascii src="${dir.resources}" dest="${dir.target}" includes="**/*.properties" />
</target>
</project>
它的目的是删除目标目录中的属性文件,并使用native2ascii
重新创建它们。删除是必要的,因为native2ascii
不会覆盖现有文件。
${project_loc}
native-to-ascii
(请注意,出于某种原因,我必须在以后再次执行此操作)src/main/resources
对我而言)并为**/*.properties
应该是这样的。如果编辑属性文件并保存,则应在输出文件夹中自动将其转换为ASCII。您可以尝试输入ü
,最终应为\u00fc
。
请注意,如果您有很多属性文件,这可能需要一些时间。每次按键后都不要保存。 :)