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

39

我有一个JavaEE项目,其中我使用消息属性文件。这些文件的编码设置为UTF-8。文件中我使用了德语umlauts,例如äöü。问题是,有时这些字符被替换为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 file encoding
    • 属性文件编码为UTF-8 Properties file encoding
  • Tomcat 8
  • Java JDK 8
  • 如果我使用另一个编辑器(如Atom)来编辑这些消息属性文件,则不会遇到此问题。

    我还意识到,在某些情况下,如果我从Git diff中复制原始值browser.searchForSimilarImages=ähnliche 并将错误的值browser.searchForSimilarImages=\uFFFD\uFFFDhnliche在Eclipse中替换为该值,则属性文件中的umlauts就是正确的。


    你指的是什么特殊工具?我应该如何执行 new String(value.getBytes("ISO-8859-1"), "UTF-8"); 以使其在属性文件中正确? - BuZZ-dEE
    因为 ISO-8859-1 问题,我建议不要使用 Java 提供的默认属性加载程序。替换加载过程,以便直接从 UTF-8 文件中加载所有内容:https://dev59.com/SG445IYBdhLWcg3w3N6z - Robert
    我的同事们没有这个问题。我想知道原因是什么。 - BuZZ-dEE
    属性文件被定义为使用ISO-8859-1编码。如果您使用UTF-8,它们根本不应该工作,因此我不明白使用这些文件的意义。 - eis
    1
    @BalusC,你没有提供你认为这不好的原因,仅仅这样说是远远不够的。 - hagrawal7777
    显示剩余6条评论
    7个回答

    52

    根本原因:

    默认情况下,Eclipse属性文件使用ISO 8859-1字符编码(参见此处),所以如果文件中包含超出ISO 8859-1的任何字符,则不会按预期进行处理。

    解决方案1

    如果您使用Eclipse,则会注意到它将特殊字符隐式转换为\uXXXX等效形式。 尝试将“会意字/會意字”复制到在Eclipse中打开的属性文件中。

    编辑:根据OP的评论

    更新Eclipse的编码如下所示。 如果将编码设置为UTF-32,则甚至可以看到通常无法看到的汉字。

    如何更改Eclipse中属性文件的编码:有关更多详细信息,请参见 Eclipse Bugzilla bug,其中讨论了其他几种可能性,并最终建议我强调的内容。

    正确设置编码后,可以在Eclipse中看到中文字符: enter image description here

    解决方案2

    如果上述方法对您不起作用(对我而言它确实有效,我从未遇到过编码问题),则可以尝试使用一些处理属性或其他文件编码的Eclipse插件。 例如Eclipse ResourceBundle Editor扩展资源包编辑器

    我建议使用Eclipse ResourceBundle Editor。

    解决方案3

    更改文件编码的另一个可能性是使用编辑-->设置编码选项。 这真的很重要,因为它会更改默认字符集和文件编码。通过使用编辑-->设置编码选项更改编码,然后执行以下Java sysout:System.out.println("Default Charset=" + Charset.defaultCharset());System.out.println(System.getProperty("file.encoding"));

    enter image description here


    顺便说一句:1

    使用本机字符转换工具 native2ascii - Native-to-ASCII Converter 处理属性文件,使其内容具有 ISO 8859-1 字符编码。 native2ascii 的作用是将所有非 ISO 8859-1 字符转换为它们的等效 \uXXXX。这是一个很好的工具,因为您不需要搜索特殊字符的 \uXXXX 等效形式。
    UTF-8 的用法: native2ascii -encoding utf8 e:\a.txt e:\b.txt 此外:

    每个计算机程序,无论是 IDE、应用服务器、Web 服务器、浏览器等,都只能理解位,因此需要知道如何解释位以使其产生预期的意义,因为根据所使用的编码,相同的位可以表示不同的字符。这就是“编码”发挥作用的地方,通过给出一个唯一的标识符来表示一个字符,以便于所有计算机程序、不同的操作系统等都知道准确的解释方式。
    因此,如果您使用某种编码方案(比如 UTF-8)写入文件,然后使用任何编辑器读取,但是在运行时使用的编码方案仍为 UTF-8,则可以期望得到正确的显示。请阅读我的这个答案以获取更多细节,但是从浏览器-服务器的角度来看。

    我不想在属性文件中出现像\uXXXX这样的内容。我希望文件中有正确的UTF-8表示。 - BuZZ-dEE
    这已经设置为UTF-8了,为什么我要使用UTF-32呢?我的同事也使用UTF-8,他们没有这个问题,所以我认为必须有另一个解决方案。 - BuZZ-dEE
    1
    有解决方案吗? - hagrawal7777
    1
    请注意,您也可以通过包资源管理器或导航器中的文件属性设置编码。此外,在您的代码中,请务必使用分别采用Reader/Writer对象的load/store方法。这样可以确保在将文件读入应用程序时指定编码。 - bimsapi
    2
    注意:在JAVA9中,UTF-8现在是属性的默认值https://docs.oracle.com/javase/9/intl/internationalization-enhancements-jdk-9.htm#JSINT-GUID-974CF488-23E8-4963-A322-82006A7A14C7 - 但您可能需要单独配置eclipse。 - pdem
    显示剩余19条评论

    4

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

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

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


    JVM使用系统编码,而我的系统使用UTF-8,同时我的属性编码设置为UTF-8 - BuZZ-dEE
    我已向Oracle提出了一个请求,希望他们能够移除默认的8859编码。目前还没有得到回复,让我们看看他们是否会解决这个问题。 - user1363516

    4
    以下更改解决该问题:
    1. 修改 eclipse.ini 文件中的以下属性,并关闭并重新启动 Eclipse 应用程序 -Dclient.encoding.override=UTF-8 -Dfile.encoding=UTF-8
    2. 将编码设置为 UTF-8 [导航路径:编辑 -> 设置编码]

    将编码设置为 UTF-8 [导航路径:编辑 -> 设置编码]


    2

    Properties Files 被期望为 ISO-8859-1 (Latin-1) 编码。很可能这也是 Eclipse 默认的编码方式。

    你必须确保每个构建或其他工具忽略规范,使用 UTF-8 代替。


    1
    但是文件中还有 äüö 字符没有替换掉。为什么这些字符没有被替换?我该如何找到导致这个问题的设置?我需要搜索所有的 Eclipse 设置和每个 Eclipse 插件来找到错误的设置吗? - BuZZ-dEE
    @Robert,我应该在Eclipse中使用哪个文件编辑器来编辑属性文件? - BuZZ-dEE
    @BuZZ-dEE 将项目编码更改为 UTF-8,然后使用标准的“文本编辑器”(请参见文件的上下文菜单 ->“打开方式”)。或者使用外部编辑器,如 Notepad++。 - Robert
    @Robert,我在哪里可以更改项目编码为UTF-8?如果我查看项目属性,那么“资源”菜单中已经有“UTF-8”编码。 - BuZZ-dEE
    3
    自Java 9以来,预计默认编码将为UTF-8。 - pdem
    显示剩余7条评论

    1
    这似乎是Eclipse和git编码的混合,或者说是非编码。Git使用原始字节,不关心编码。使用git diff可能会得到像这里显示的字符。一个例子是R<C3><BC>ckg<C3><A4>ngig # should be "Rückgängig"。如您所见,每个umlaut都显示了两个有趣的括号符号。在您的编辑器中,以+开头的行中的每个umlaut总是有两个\uFFFD。因此,我认为您的UTF-8编辑器试图解释git符号并失败了。这反过来导致表示\uFFFD,它基本上意味着这是一个未知或无法表示值的字符(请参阅此处)。

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


    我在FISH shell中使用了set LESSCHARSET UTF-8,之后我也遇到了\uFFFD\uFFFD而不是正确的符号。 - BuZZ-dEE

    0

    请参见:在http://unicode.org/faq/utf_bom.html中查看诸如FFF(替换字符)之类的标记

    并查看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 
    

    0

    如果你使用的是Windows 11,你可以通过更改区域设置来解决这个问题。不确定早期版本是否适用。

    查看完整详细答案


    我使用Arch Linux。 - undefined

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接