Eclipse错误的Java属性UTF-8编码

我有一个JavaEE项目,我在其中使用消息属性文件。 这些文件的编码设置为UTF-8。 在文件中,我使用äöü等德语变音符号。 问题是,有时这些字符被替换为unicode,如\uFFFD\uFFFD ,但不是每个字符。 现在,我有一个案例,其中äü都被替换为\uFFFD\uFFFD ,但不是每次出现的äü

Git diff给我看了这样的事情:

  mail.adresses=E-Mail hinzufügen: -mail.adresses.multiple=E-Mails durch Kommata getrennt hinzufügen. +mail.adresses.multiple=E-Mails durch Kommata getrennt hinzuf\uFFFD\uFFFDgen. mail.title=Einladungs-E-Mail box.preview=Vorschau box.share.text=Sie können jetzt die ausgewählten Bilder mit Ihren Freunden teilen. @@ -6880,7 +6880,7 @@ browser.cancel=Abbrechen browser.selectImage=übernehmen browser.starImage=merken browser.removeImage=Löschen -browser.searchForSimilarImages=ähnliche +browser.searchForSimilarImages=\uFFFD\uFFFDhnliche browser.clear_drop_box=löschen 

此外,还有一些线路已经改变,我没有碰过。 我不明白为什么我会这样做。 可能是上述问题的原因是什么?

我的系统:

  • Antergos / Arch Linux

    • 系统编码UTF-8

       Python 3.5.0 (default, Sep 20 2015, 11:28:25) [GCC 5.2.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import sys >>> sys.getdefaultencoding() 'utf-8' 
  • Eclipse Mars 1

    • 编码UTF-8的文本文件 ext文件编码
    • 属性文件编码为UTF-8 属性文件编码
  • Tomcat 8
  • Java JDK 8

如果我使用像Atom这样的其他编辑器来编辑这些消息属性文件,我不会遇到这个问题。

我也在一个案例中意识到,如果我从Git diff复制原始值browser.searchForSimilarImages=ähnliche并用Eclipse替换错误值browser.searchForSimilarImages=\uFFFD\uFFFDhnliche ,那么我在消息属性文件中有正确的变音符号。

根本原因:

默认情况下,ISO 8859-1字符编码用于Eclipse属性文件( 在此处阅读),因此如果文件包含ISO 8859-1之外的任何字符,则不会按预期处理它。

解决方案1

如果您使用Eclipse,那么您会注意到它隐式地将特殊字符转换为\ uXXXX等效字符。 尝试复制

会意字/会意字

到Eclipse中打开的属性文件中。

编辑:根据OP的评论

更新Eclipse的编码,如下所示。 如果您将编码设置为UTF-32,那么即使您可以看到中文字符,您通常也看不到。

如何在Eclipse中更改属性文件的编码:有关更多详细信息,请参阅此 Eclipse Bugzilla错误,其中讨论了其他几种可能性,最后提出了我在下面强调的内容。 在此处输入图像描述

正确设置编码后,可以在Eclipse中看到中文字符: 在此处输入图像描述

解决方案2

如果上面的内容不能一致地为你工作( 它确实对我有用,我从来没有看到编码问题 ),那么尝试使用一些处理属性或其他文件编码的Eclipse插件 。 例如Eclipse ResourceBundle Editor或Extended Resource-Bundle编辑器

我建议使用Eclipse ResourceBundle Editor。

解决方案3

更改文件编码的另一种可能性是使用“ Edit --> Set Encoding选项。 这非常重要,因为它更改了默认字符集和文件编码。 通过使用Edit --> Set Encoding选项更改编码来进行操作,并执行以下Java sysout System.out.println("Default Charset=" + Charset.defaultCharset());System.out.println(System.getProperty("file.encoding"));

在此处输入图像描述


暂且不说:1

使用native2ascii – Native-to-ASCII Converter处理属性文件以使内容具有ISO 8859-1字符编码

native2ascii的作用:它将等效的\ uXXXX中的所有非ISO 8859-1字符转换为。 这是一个很好的工具,因为你不需要搜索\ uXXXX等效的特殊字符。

UTF-8的用法: native2ascii -encoding utf8 e:\a.txt e:\b.txt


暂且不说:2

每个计算机程序,无论是IDE,应用程序服务器,Web服务器,浏览器等,只能理解位,因此需要知道如何解释这些位以使其具有预期的意义,因为根据所使用的编码,相同的位可以表示不同的字符。 而这就是“编码”通过给出一个唯一的标识符来表示一个角色,以便所有计算机程序,各种操作系统等知道解释它的正确方法。

因此,如果您使用某种编码方案写入文件,让我们说UTF-8,然后使用任何编辑器进行读取,但使用编码方案作为UTF-8运行,那么您可以期望得到正确的显示。

请阅读我的这个答案以获取更多详细信息,但从浏览器 – 服务器的角度来看。

属性文件应为ISO-8859-1(Latin-1)编码。 这很可能也是默认设置为eclipse的原因。

您必须确保在构建中运行的每个工具或其他任何忽略规范并使用UTF-8的工具。

将以下参数添加到eclipse.ini文件中。

 -Dclient.encoding.override=UTF-8 -Dfile.encoding=UTF-8 

默认情况下,Eclipse使用Java虚拟机(JVM)获取的编码格式。 此外,您可以将文件编码设置为utf-8

这看起来像是Eclipse和git编码的混合,而不是编码。

Git使用原始字节而不关心编码。 使用git diff你可能会得到如此处所示的字符。 一个例子是Rckgngig # should be "Rückgängig"

正如你所看到的,每个变音符号都有两个有趣的括号内容。 在你的编辑器中,每个变音符号总是有两个\uFFFD ,以+开头。

所以我假设您的UTF-8编辑器试图解释git表示法并失败。 这反过来导致代表\uFFFD ,这基本上表明这是一个价值未知或无法代表的人物( 见这里 )。

与第一个链接中建议的一样,您可以尝试在环境变量(Windows)中设置LESSCHARSET=UTF-8 。 嗯,在Linux中它应该在etc/profile

请参阅: http ://unicode.org/faq/utf_bom.html中的标记,如FFFD(REPLACEMENT CHARACTER)

并看到native2ascii –help

  -encoding encoding_name Specifies the name of the character encoding to be used by the conversion procedure. If this option is not present, then the default character encoding (as determined by the java.nio.charset.Charset.defaultCharset method) is used. The encoding_name string must be the name of a character encoding that is supported by the JRE. See Supported Encodings at http://docs.oracle.com/javase/8/docs/technotes/guides/intl/encoding.doc.html 

一件事

 $ file yourfile.properties yourfile.properties : ISO-8859 text, with very long lines $ native2ascii -encoding ISO-8859-1 yourfile.properties yourfile.properties