2011-11-21 62 views
1

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

我发现了一个类似的问题在这里:Java properties UTF-8 encoding in Eclipse该通知:我安装的资源包插件。我安装并使用插件来编辑相应的属性,但我仍然有问题。

是否有一个快速的解决方案(我的意思是不会造成应用程序太多变化的解决方案,因为它是在基本完成阶段),将解决我遇到的问题。

也许我应该提一下,我正在开发和使用Firefox 7.提前 感谢Ubuntu下的Linux操作系统观察的问题。

编辑: 我没有提到的一个重要问题。我的用户界面是用GWT编写的,而且这些属性由一个接口公开,这个接口在GWT用来在内部创建该接口的实现并链接到相应属性的getter上有注释。所以我想我对属性如何实际读取没有太多的控制,或者至少我不知道如何在GWT中进行操作。

+1

也许尝试将某些属性在检索到时回送到控制台或日志文件。查看从属性文件实际获得的内容。 –

+0

我已经为我的案例添加了一些说明。我正在使用自动解析属性的GWT,似乎我无法控制属性文件如何实际读取。 –

+0

[Eclipse中的Java属性utf8编码问题]的可能重复(http://stackoverflow.com/questions/863838/problem-with-java-properties-utf8-encoding-in-eclipse) – Raedwald

回答

3

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

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

我建议避免使用unicode转义,如果可能的话。

+0

我没有在代码中手动读取属性。我创建了一个接口,通过注释获取它们到接口的getter - 至少这就是我被告知GWT使用属性的方式。我没有自己编写代码,我也不太熟悉GWT中的属性,所以我不知道实际使用的编码是什么。但我确信一件事 - 属性文件是使用eclipse IDE的默认值创建的,并且团队中的任何人都无需手动更改其编码。所以,他们都使用ISO 8859-1。 –

+1

@Ivaylo:这是你必须改变的第一件事 –

+2

@Ivaylo:请注意,根据谷歌自己的文档,GWT实际上*期望*属性文件是UTF-8!所以这就是所有*你必须改变。 http://code.google.com/intl/de-DE/webtoolkit/doc/latest/tutorial/i18n.html –

4

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

所以请不要输入Unicode字符拉丁文1的外部直接进入你的本地化文件。这些字符应该以Unicode转义字符的形式输入。

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

其他海报正指出解决这个问题的方法。但个人而言,我更愿意坚持使用属性资源文件中的标准编码 - 这样它就可以处理所有事情。没有什么能阻止你用UTF-8编码创建你的文件,并将它们转换为Latin 1转义Unicode作为你构建的一部分(例如Ant任务)。

+0

是的,我也读过使用默认编码以外的属性文件不是一个好主意。你碰巧知道资源包插件是否使用native2ascii工具在内部使用非Unicode字符,或者我应该手动转义unicode符号? –

+0

@Ivaylo:请注意,这是过时的信息。自Java 6以来,有一个采用Reader参数的Properties.load()方法,允许使用任何你喜欢的编码。当然,如果你的属性文件是由某个框架加载而不是在你自己的代码中加载的,那么这个特性对你来说可能毫无用处。 –

+0

@Micheal另一个这样的框架的例子 - [java.util.ResourceBundle](http://download.oracle.com/javase/6/docs/api/java/util/ResourceBundle.html),以及任何构建于此的框架。 – sudocode

1

我也遇到过同样的问题。我通过写我自己的Control延伸java.util.ResourceBundle.Control克服了这个问题。在将资源束作为特征文件读取时,重写以包括相关字符集的重要方法是参数。

虽然不难;我拥有的方法很久没有做到了。

另一种选择是使用cal10n(http://cal10n.qos.ch/),但这可能需要进行重要的改进。

+0

您是否碰巧知道资源包插件是否在内部为非Unicode字符使用native2ascii工具,或者我应该手动转义unicode符号? –

+0

不熟悉eclipse的资源包插件。抱歉。 –

+0

不用担心,我会早晚找到手动:) –

2

根据this GWT localization page(这是一个教程使用由您指的是更新后的答案标注方法本地化),它说

编码国际字符集

当国际化你的应用程序接口,请记住 您支持的语言可能包含不在ASCII 字符集中的字符。因此,无论是在HTML主机页面 (StockWatcher.html)还是包含 翻译的Java属性文件中,都必须将编码设置为UTF-8。

并在标题下的一个例子 “创建StockWatcherConstant_de.properties”,它说:

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

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

Eclipse打开属性窗口。

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

注:根据您的 Eclipse配置,当你应用更改,你可能会得到这样 警告:在内容类型 (ISO-8859-1)定义的编码UTF-8的冲突。你是否想要设置它?您可以忽略 警告并应用更改。

+0

也感谢你,虽然我已经阅读了Michael Borgwardt的回答的最后评论,并在注意到你的答案之前接受了它。 –