Eclipse中的Java属性UTF-8编码

GvS*_*GvS 48 java eclipse encoding utf-8

我最近不得不将我正在处理的webapp的编码切换ISO-xxutf8.一切顺利,除了属性文件.我加入-Dfile.encoding=UTF-8eclipse.ini,普通文件工作正常.然而属性显示出一些奇怪的行为

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

Zur\u00EF\u00BF\u00BDck instead of Zurück
Run Code Online (Sandbox Code Playgroud)

但应用程序仍然正常.如果我开始编辑属性,添加一些特殊字符并保存,它们会正确显示,但它们不起作用,所有以前工作的特殊字符都不再起作用.

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

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

我正在使用基于Eclipse 3.3的Java 6和Jboss Developer

我可以通过在Notepad ++中编辑属性并在Eclipse中粘贴它们来使用它,但如果有人可以帮助我在Eclipse中修复它,我将不胜感激.

Jon*_*eet 64

根据定义,属性文件是ISO-8859-1 - 请参阅Properties类的文档.

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

编辑:正如劳伦斯在评论中指出的那样,Java 1.6引入了重载load并且store采用了Reader/ Writer.这意味着您可以使用您想要的任何编码为该文件创建一个阅读器,并将其传递给load.遗憾的是,FileReader 仍然不允许您在构造函数(aargh)中指定编码,因此您将陷入链接FileInputStreamInputStreamReader一起.但是,它会起作用.

例如,要使用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();
}
Run Code Online (Sandbox Code Playgroud)

  • 在Java 1.6中,您可以使用使用Reader/Writer而不是InputStream/OutputStream的方法来使用其他编码. (5认同)

bay*_*ren 54

不要浪费你的时间,你可以在Eclipse中使用Resource Bundle插件

基本屏幕截图

旧的Sourceforge页面

  • 这是一个非常有用的插件,谢谢你的提示!如此糟糕,它没有安装URL,但只是将它放在插件文件夹上就可以了. (3认同)
  • 这是否在内部使用native2ascii工具用于非unicode字符,或者我应该手动转义unicode符号? (3认同)

Mar*_*gón 12

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

从课程文档:

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

从API,store()方法:

小于\ u0020且字符大于\ u007E的字符将写为\ uxxxx,表示相应的十六进制值xxxx.

  • NetBeans很好地显示具有\ uXXXX转义的属性文件,并允许您使用正确显示的UTF字符对其进行编辑.为什么没有Eclipse?在我看来,这是Eclipse的一个问题. (4认同)

小智 10

Properties props = new Properties();
URL resource = getClass().getClassLoader().getResource("data.properties");         
props.load(new InputStreamReader(resource.openStream(), "UTF8"));
Run Code Online (Sandbox Code Playgroud)

奇迹般有效

:-)