我有一个 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
- 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 错误以获取更多详细信息,其中讨论了其他几种可能性,最后提出了我在下面突出显示的内容。
设置好编码后在Eclipse中可以看到汉字:
解决方案 2
如果上述方法对您不起作用(它确实对我有用,而且我从来没有看到编码问题)然后尝试使用一些处理属性编码的 Eclipse 插件 或其他文件。例如 Eclipse ResourceBundle Editor或 Extended 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"));
顺便说一句: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/