Eclipse中的Java属性UTF-8编码

Eclipse中的Java属性UTF-8编码,java,eclipse,encoding,utf-8,Java,Eclipse,Encoding,Utf 8,我最近不得不将我正在开发的webapp的编码从isoxx切换到utf8。除了属性文件,一切都很顺利。我在eclipse.ini中添加了-Dfile.encoding=UTF-8,普通文件工作正常。然而,这些属性表现出一些奇怪的行为 如果我从Notepad++复制utf8编码的属性并将它们粘贴到Eclipse中,它们就会显示出来,并且工作正常。当我重新打开属性文件时,我看到一些Unicode字符而不是正确的字符,如: Zur\u00EF\u00BF\u00BDck instead of Zurüc

我最近不得不将我正在开发的webapp的编码从
isoxx
切换到
utf8
。除了属性文件,一切都很顺利。我在eclipse.ini中添加了
-Dfile.encoding=UTF-8
,普通文件工作正常。然而,这些属性表现出一些奇怪的行为

如果我从Notepad++复制
utf8
编码的属性并将它们粘贴到Eclipse中,它们就会显示出来,并且工作正常。当我重新打开属性文件时,我看到一些Unicode字符而不是正确的字符,如:

Zur\u00EF\u00BF\u00BDck instead of Zurück
但该应用程序仍然运行良好。 如果我开始编辑属性,添加一些特殊字符并保存,它们将正确显示,但是它们不起作用,并且所有以前工作的特殊字符不再起作用

当我将本地版本与CVS进行比较时,我可以在远程文件上正确地看到特殊字符,并且在更新之后我又重新开始了:应用程序工作了,但Eclipse显示Unicode字符

我试图通过右键单击文件并选择“其他:UTF8”来更改文件编码,但没有任何帮助。它还说:“根据内容确定:ISO-8859-1”

我正在使用基于Eclipse3.3的Java6和JBossDeveloper

我可以在Notepad++中编辑属性并将它们粘贴到Eclipse中,但如果有人能帮助我在Eclipse中解决这个问题,我将不胜感激。从Java 9开始,默认情况下属性文件以UTF-8保存和加载,但如果检测到无效的UTF-8字节序列,则返回ISO-8859-1。有关详细信息,请参阅


属性文件的定义为ISO-8859-1-请参阅类的文档

Spring有一个替换项,可以使用指定的编码加载

编辑:正如Laurence在评论中指出的那样,Java1.6为
load
store
引入了重载,它们使用
读卡器
/
编写器
。这意味着您可以使用所需的任何编码为文件创建读取器,并将其传递给
load
。不幸的是,
FileReader
仍然不允许您在构造函数(aargh)中指定编码,因此您将不得不将
FileInputStream
InputStreamReader
链接在一起。不过,它会起作用的

例如,要使用UTF-8读取文件:

Properties properties = new Properties();
InputStream inputStream = new FileInputStream("path/to/file");
try {
    Reader reader = new InputStreamReader(inputStream, "UTF-8");
    try {
        properties.load(reader);
    } finally {
        reader.close();
    }
} finally {
   inputStream.close();
}

这不是Eclipse的问题。如果使用Properties类读取和存储属性文件,则该类将转义所有特殊字符

将属性保存到流或从流加载属性时,使用ISO 8859-1字符编码。对于无法在此编码中直接表示的字符,使用Unicode转义符;但是,转义序列中只允许一个“u”字符。native2ascii工具可用于在其他字符编码之间转换属性文件

对于适当的十六进制值xxxx,小于\u0020和大于\u007E的字符写入为\uxxx


在你描述的过程中,有太多的地方可能会发生错误,所以我不会试图猜测你做错了什么,但我想我知道在幕后发生了什么

EF-BF-BD
U+FFFD
的UTF-8编码形式,是解码器遇到格式错误输入时插入的标准替换字符。听起来您的文本保存为ISO-8859-1,然后像UTF-8一样读取,然后保存为UTF-8,然后使用平台默认编码(例如windows-1252),使用
native2ascii
转换为属性格式

ü=>0xFC//另存为ISO-8859-1 0xFC=>U+FFFD//读作UTF-8 U+FFFD=>0xEF 0xBF 0xBD//另存为UTF-8 0xEF 0xBF 0xBD=>\u00EF\u00BF\u00BD//native2ascii
我建议您不要使用“file.encoding”属性。就像“file.separator”和“line.separator”一样,它并不像您期望的那样有用。相反,要养成在读写文本文件时总是指定编码的习惯。

这似乎只适用于某些字符。。。包括德语、葡萄牙语、法语的特殊字符。然而,我遇到了俄语、印地语和普通话的麻烦。这些文件不会转换为“native2ascii”属性格式,而是使用???保存
我能让我的应用程序正确显示这些字符的唯一方法是将它们放在转换为UTF-8格式的属性文件中\u0915,而不是क, 或\u044F而不是\。
有什么建议吗?

不要浪费时间,您可以在Eclipse中使用

很有魅力

:-)


这在Java1.6中运行良好。在1.5中如何做到这一点,因为Properties类没有一个方法来pars
InputStreamReader

只是另一个用于*.Properties文件的Eclipse插件:


如果属性用于XML或HTML,则使用XML实体是最安全的。它们的可读性更差,但这意味着属性文件可以被视为纯ASCII,因此不会有任何内容被破坏


请注意,HTML有XML没有的实体,因此我通过使用纯XML来保证它的安全:

我建议您使用Attesoro()。它简单易用。而且是用java制作的。

有更简单的方法:

props.load(new InputStreamReader(new FileInputStream("properties_file"), "UTF8"));

您可以定义UTF-8.properties文件来存储翻译,并使用ResourceBundle来获取值。要避免出现问题,可以更改编码:

String value = RESOURCE_BUNDLE.getString(key); 
return new String(value.getBytes("ISO-8859-1"), "UTF-8");

在Java 1.6中,您可以通过使用Reader/Writer而不是InputStream/OutputStream的方法来使用其他编码。这是一个比公认答案中的更通用的解决方案,因此更好:)@JonSkeet我已经研究这个问题好几个星期了。非常感谢你!从Java 9+开始,属性文件应该用UTF-8:@RuneAamodt:编码,尽管我很高兴看到读取时仍然支持ISO-8859-1。将更新我的答案。这是一个非常有用的插件,t
Properties props = new Properties();
URL resource = getClass().getClassLoader().getResource("data.properties");         
props.load(new InputStreamReader(resource.openStream(), "UTF8"));
props.load(new InputStreamReader(new FileInputStream("properties_file"), "UTF8"));
String value = RESOURCE_BUNDLE.getString(key); 
return new String(value.getBytes("ISO-8859-1"), "UTF-8");