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

标签 java eclipse utf-8 properties-file

我有一个 JavaEE 项目,我在其中使用消息属性文件。这些文件的编码设置为 UTF-8。在文件中,我使用了德语变音符号,例如 äöü。问题是,有时这些字符会被替换为像 \uFFFD\uFFFD 这样的 unicode,但不是针对每个字符。现在,我遇到了 äü 都替换为 \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 火星 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 中,然后我在消息属性文件中有正确的变音符号。

最佳答案

根本原因:

默认情况下,Eclipse 属性文件使用 ISO 8859-1 字符编码(读取 here),因此如果文件包含任何超出 ISO 8859-1 的字符,则不会按预期处理。

解决方案 1

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

会意字 / 會意字

放入在 Eclipse 中打开的属性文件中。

编辑:根据 OP 的评论

如下所示更新 Eclipse 的编码。如果你设置编码为UTF-32,那么你也能看到汉字,一般是看不到的。

如何在 Eclipse 中更改属性文件的编码:参见 this Eclipse Bugzilla 错误以获取更多详细信息,其中讨论了其他几种可能性,最后提出了我在下面突出显示的内容。 enter image description here

设置好编码后在Eclipse中可以看到汉字: enter image description here

解决方案 2

如果上述方法对您不起作用(它确实对我有用,而且我从来没有看到编码问题)然后尝试使用一些处理属性编码的 Eclipse 插件 或其他文件。例如 Eclipse ResourceBundle EditorExtended Resource-Bundle editor

我建议使用 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"));

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


顺便说一句:2

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

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

请阅读我的this answer从浏览器服务器的角度获取更多详细信息。

关于java - Eclipse 错误的 Java 属性 UTF-8 编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31143923/

相关文章:

java - OpenCv 人脸追踪 Android 应用程序

android - 在eclipse中导入libgdx gradle项目给出错误

eclipse - Eclipse 工具栏损坏

javascript - nodejs UTF-8编码字符串有黑色问号

java - 获取 Spinner 中的所有关键数据

java - Spring Batch 2.x 中的 BATCH_STEP_EXECUTION 中缺少 ITEM_COUNT 列

mysql - R控制台中的错误字符编码

python - 如何从 Bottle 中的表单获取 utf-8?

java - 在 Java 中开发自定义 GUI 生成器

java - Android - Retrofit2 - java.security.cert.CertPathValidatorException : Trust anchor for certification path not found