Eclipse中的Java属性UTF-8编码

我最近不得不把我正在从ISO-xx工作的webapp编码切换到utf8 。 一切顺利,除了属性文件。 我在eclipse.ini添加了-Dfile.encoding=UTF-8 ,正常的文件工作正常。 属性然而显示一些奇怪的行为。

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

 Zur\u00EF\u00BF\u00BDck instead of Zurück 

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

当我比较本地版本与CVS时,我可以在远程文件上正确地看到特殊字符,更新后,我再次启动:应用程序工作,但Eclipse显示Unicode字符。

我尝试通过右键单击并select“其他:UTF8”更改文件编码,但它没有帮助。 它还表示:“从内容上确定:ISO-8859-1”

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

我可以通过在Notepad ++中编辑属性并将它们粘贴到Eclipse中来支持它,但是如果有人能帮助我在Eclipse中解决这个问题,我将不胜感激。

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

基本的屏幕截图

旧的Sourceforge页面

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

Spring有一个可以使用PropertiesFactoryBean加载指定编码的replace。

编辑:正如劳伦斯在评论中指出的,Java 1.6引入了loadstoreReader / Writer Reader重载。 这意味着您可以使用任何您想要的编码为文件创build一个阅读器,并将其传递到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(); } 

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

从类文档:

将属性保存到stream中或从stream中加载它们时,将使用ISO 8859-1字符编码。 对于在此编码中不能直接表示的字符,使用Unicode转义符; 然而,在转义序列中只允许一个“u”字符。 native2ascii工具可用于将属性文件转换为其他字符编码和从其他字符编码转换。

从API,store()方法:

小于\ u0020的字符和大于\ u007E的字符被写为\ uxxxx,以获得相应的hex值xxxx。

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

奇迹般有效

🙂

在描述发生错误的过程中有太多的要点,所以我不会去猜测你做错了什么,但是我想我知道发生了什么。

EF BF BDU+FFFD的UTF-8编码forms,是由解码器在遇到格式错误的input时插入的标准replace字符。 这听起来像你的文本被保存为ISO-8859-1,然后读取为UTF-8,然后保存为UTF-8,然后使用平台默认编码使用native2ascii转换为属性格式(例如, 1252)。

  ü=> 0xFC //保存为ISO-8859-1
 0xFC => U + FFFD //读取为UTF-8
 U + FFFD => 0xEF 0xBF 0xBD //保存为UTF-8
 0xEF 0xBF 0xBD => \ u00EF \ u00BF \ u00BD // native2ascii 

我build议你单独留下“file.encoding”属性。 像“file.separator”和“line.separator”一样,它不如你所期望的那样有用。 相反,养成在读写文本文件时总是指定编码的习惯。

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

这在java 1.6中运行良好。 我怎么能在1.5中做到这一点,因为属性类没有一个方法来分析InputStreamReader

有更简单的方法:

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

* .properties文件的另一个Eclipse插件:

属性编辑器

这似乎只适用于一些字符…包括德语,葡萄牙语,法语的特殊字符。 然而,我遇到了俄语,印地语和普通话的麻烦。 这些不会转换为属性格式“native2ascii”,而是保存与?? ?? ??
唯一可以让我的应用程序正确显示这些字符的方法是将它们放入属性文件中,并将其转换为UTF-8格式 – 如\ u0915而不是\或\ u044F而不是\ u044F。 任何build议?

我build议你使用Attesoro( http://attesoro.org/ )。 简单易用。 并在Java中。

您可以定义UTF-8 .properties文件来存储您的翻译并使用ResourceBundle来获取值。 为了避免问题,你可以改变编码:

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

如果这些属性是用于XML或HTML的,那么使用XML实体是最安全的。 他们更难读,但这意味着属性文件可以被视为直接的ASCII,所以没有什么会被弄乱。

请注意,HTML具有XML不存在的实体,所以通过使用直接的XML保证了它的安全: http : //www.w3.org/TR/html4/sgml/entities.html