Eclipse 错误的 Java 属性 UTF-8 编码根源:解决方案 1解决方案 2解决方案 3

2022-09-01 06:00:05

我有一个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'
      
  • 日食火星1

    • 文本文件编码 UTF-8ext file encoding
    • 属性文件编码 UTF-8Properties file encoding
  • 雄猫 8
  • Java JDK 8

如果我使用另一个编辑器(如Atom)来编辑这些消息属性文件,则不会遇到此问题。

我还意识到,如果我从Git diff复制原始值并用它替换Eclipse中的错误值,那么我在消息属性文件中就有了正确的元音变音符。browser.searchForSimilarImages=ähnlichebrowser.searchForSimilarImages=\uFFFD\uFFFDhnliche


答案 1

根源:

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

解决方案 1

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

会意字 / 會意字

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

编辑:根据OP的评论

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

如何在 Eclipse 中更改属性文件的编码:有关更多详细信息,请参阅Eclipse Bugzilla错误,其中讨论了其他几种可能性,并最终建议了我在下面突出显示的内容。enter image description here

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

解决方案 2

如果上述方法不能一致地为您工作(它确实适用于我,而且我从未见过编码问题),那么请使用一些Eclipse插件尝试此操作,该插件处理属性或其他文件的编码。例如 Eclipse ResourceBundle EditorExtended Resource-Bundle Editor

我建议使用Eclipse ResourceBundle Editor。

解决方案 3

更改文件编码的另一种可能性是使用选项。这确实很重要,因为它更改了默认字符集和文件编码。通过使用选项更改编码来尝试,并遵循Java系统,并执行以下操作Edit --> Set EncodingEdit --> Set EncodingSystem.out.println("Default Charset=" + Charset.defaultCharset());System.out.println(System.getProperty("file.encoding"));

enter image description here


顺便说一句:1

使用 native2ascii - Native-asCII 转换器处理属性文件以包含 ISO 8859-1 字符编码的内容

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

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


顺便说一句:2

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

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

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


答案 2

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

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

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


推荐