【问题标题】:Java properties files localization & character encoding issueJava 属性文件本地化和字符编码问题
【发布时间】:2012-01-02 22:09:56
【问题描述】:

我正在开发一个 Java Web 应用程序,该应用程序现在处于开发的最后阶段,剩下的事情之一就是本地化。我们为每个受支持的语言环境使用属性文件。 我发现的问题是某些 unicode 字符在 Web 浏览器中没有正确显示。网页在字符集元标记中指定了 UTF-8 编码,并且浏览器已正确检测到它(在 Firefox View->Character Encoding 中似乎选择了正确的编码)。我认为问题出在这样一个事实,即当应用程序将文本显示为 UTF-8 时,属性文件以 ISO*xxxx 编码保存,这恰好是一些 eclipse 默认设置。

我在这里发现了一个类似的问题:Java properties UTF-8 encoding in Eclipse,它建议我安装资源包插件。我安装并使用插件编辑了相应的属性,但还是有问题。

是否有一个快速的解决方案(我的意思是一个不会对应用程序造成太多变化的解决方案,因为它几乎处于完成阶段)可以克服我遇到的问题。

也许我应该提到我正在使用 Firefox 7 在 Ubuntu Linux OS 下开发和观察问题。 提前致谢。

编辑: 我没有提到重要的事情。我的用户界面是用 GWT 编写的,属性由一个接口公开,该接口在 GWT 用于在内部创建该接口的实现并链接到相应属性的 getter 上具有注释。所以我想我对如何实际读取属性没有太多控制权,或者至少我不知道如何在 GWT 中做到这一点。

【问题讨论】:

  • 也许尝试在检索到某些属性时将其回显到控制台或日志文件。查看从属性文件中实际获取的内容。
  • 我为我的案例添加了一些说明。我正在使用自动解析属性的 GWT,似乎我无法控制属性文件的实际读取方式。

标签: java eclipse localization internationalization web


【解决方案1】:

Java properties files 采用 ISO 8859-1(拉丁文 1)编码。其他字符必须使用转义的 Unicode 表示。

因此,您不应将拉丁语 1 以外的 Unicode 字符直接输入到本地化文件中。此类字符应作为 Unicode 转义符输入。

如果您有一堆 UTF-8(或其他)编码的属性文件,您可以使用 JDK 中的 native2ascii 工具将这些文件转换为拉丁语 1 转义的 unicode。另外,Ant 有一个native2ascii task

其他海报指出了解决此问题的方法。但就个人而言,我更愿意坚持属性资源文件中的标准编码 - 这样它就可以与所有东西一起使用。没有什么可以阻止您以 UTF-8 编码创作文件并将它们转换为拉丁语 1 转义的 unicode 作为构建的一部分(例如 Ant 任务)。

【讨论】:

  • 是的,我还读到,使用默认编码以外的属性文件并不是一个好主意。您是否碰巧知道资源包插件是否在内部使用 native2ascii 工具处理非 unicode 字符,或者我应该手动转义 unicode 符号?
  • @Ivaylo:请注意,这是过时的信息。从 Java 6 开始,有一个带有 Reader 参数的 Properties.load() 方法,允许使用您喜欢的任何编码。当然,如果您的属性文件是由某个框架而不是在您自己的代码中加载的,那么此功能可能对您毫无用处。
  • @Micheal 另一个此类框架的示例 - java.util.ResourceBundle,以及基于此的任何东西。
  • @sudocode:可以选择资源包的编码;见布雷特的回答。我自己也使用过这种方法。
  • 伙计们,我已经更新了我的问题,我没有在这里澄清一个重要的情况 - 属性是由 GWT 读取的,而不是由我们团队编写的专用代码读取的。
【解决方案2】:

我也遇到了同样的问题。我通过编写自己的Control 扩展java.util.ResourceBundle.Control 克服了这个问题。在将资源包读取为propoerty 文件时,覆盖以包含相关字符集的重要方法是newBundle( ... ) 5 个参数。

虽然不难;我的方法很啰嗦。

另一种选择是使用 cal10n (http://cal10n.qos.ch/),但这可能需要大量改造。

【讨论】:

  • 您是否知道资源包插件是否在内部使用 native2ascii 工具处理非 unicode 字符,或者我应该手动转义 unicode 符号?
  • 不熟悉 Eclipse 的资源包插件。对不起。
  • 别担心,我迟早会手动找出来的:)
【解决方案3】:

这里有两个完全不同的问题:

  • 属性文件是否以正确的编码保存?如果在 Eclipse 中编辑它们,则必须在项目属性中设置文本文件编码。请注意,此设置保存在项目的 .settings 子目录中。
  • 用于读取属性文件的编码是否正确?如果您在代码中阅读它们,请务必使用InputStreamReader 来设置编码。如果它们被某些框架读取,则必须查看其 API 和配置,以查看是否可以指定编码。

我建议尽可能避免使用 unicode 转义。

【讨论】:

  • 我没有在代码中手动读取属性。我创建了一个接口,它通过对接口 getter 的注释来获取它们——至少这就是我被告知 GWT 与属性一起工作的方式。我自己还没有编写该代码,而且我对读取 GWT 中的属性不太熟悉,所以我不知道实际使用的编码是什么。不过,我可以肯定一件事——属性文件是使用 eclipse IDE 的默认值创建的,团队中的任何人都不会对其编码进行手动更改。因此,它们都使用 ISO 8859-1。
  • @Ivaylo:那是你必须改变的第一件事
  • @Ivaylo:请注意,根据 Google 自己的文档,GWT 实际上期望属性文件为 UTF-8!事实上,这就是您必须更改的全部code.google.com/intl/de-DE/webtoolkit/doc/latest/tutorial/…
  • 感谢您的努力!实际上,解决方案就像更改文件编码一样简单。首先我很不情愿,因为我在某处读到更改属性文件编码可能会导致问题,但由于 Google 建议使用 UTF-8,我想我应该忽略它。
【解决方案4】:

根据this GWT localization page(这是一个使用您在更新答案中引用的注释方法本地化的教程),它说

国际字符集编码

当您将应用程序的界面国际化时,请记住 您支持的语言可能包含非 ASCII 字符 字符集。因此,无论是在 HTML 宿主页面中 (StockWatcher.html),以及包含 翻译,您必须将编码设置为 UTF-8。

在“创建 StockWatcherConstant_de.properties”标题下的示例中,它说:

将文件的编码更改为 UTF-8。

选择文件,然后从 Eclipse 菜单栏中选择文件 > 属性或右键单击。

Eclipse 打开属性窗口。

在文本文件编码中,选择其他 UTF-8。应用并保存更改。

注意:取决于您的 Eclipse 配置,当您应用更改时,您可能会得到这个 警告:UTF-8 与内容类型中定义的编码冲突 (ISO-8859-1)。你还是要设置它吗?你可以忽略 警告并应用更改。

【讨论】:

  • 也谢谢你,虽然我已经阅读了 Michael Borgwardt 回答的最后一条评论并在注意到你之前接受了它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-22
相关资源
最近更新 更多