2014-03-13 155 views
2

我需要为非拉丁语言(简体中文,日文汉字等)创建i18n属性文件使用我们产品的Swing部分,我们使用其中包含原始UTF-8字符的Java属性文件,Netbeans会自动为我们转换为8859-1,并且它工作正常。使用JavaFX,这种策略不起作用。 Our strategy matches this answer precisely这似乎并没有在这种情况下工作。如何使用非拉丁字符的FXML和属性文件?

在我对这个问题的调查中,我发现this old article表示需要使用native2ascii转换属性文件中的字符;仍然不起作用。

为了消除尽可能多的变量,我创建了一个示例FXML项目来说明问题。日文汉字有三个国际化标签。第一个标签在FXML文档中有文本。第二个从属性文件加载原始未转义字符。第三个加载转义Unicode(匹配native2ascii输出)。

jp_test.properties

btn.one=閉じる 
btn.two=\u00e9\u2013\u2030\u00e3\ufffd\u02dc\u00e3\u201a\u2039 

jp_test.fxml

<?xml version="1.0" encoding="UTF-8"?> 

<?import java.lang.*?> 
<?import java.util.*?> 
<?import javafx.scene.control.*?> 
<?import javafx.scene.layout.*?> 
<?import javafx.scene.paint.*?> 
<?scenebuilder-preview-i18n-resource jp_test.properties?> 

<AnchorPane id="AnchorPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="147.0" prefWidth="306.0" xmlns:fx="http://javafx.com/fxml"> 
    <children> 
    <Label layoutX="36.0" layoutY="33.0" text="閉じる" /> 
    <Label layoutX="36.0" layoutY="65.0" text="%btn.one" /> 
    <Label layoutX="36.0" layoutY="97.0" text="%btn.two" /> 
    <Label layoutX="132.0" layoutY="33.0" text="Static Label" textFill="RED" /> 
    <Label layoutX="132.0" layoutY="65.0" text="Properties File Unescaped" textFill="RED" /> 
    <Label layoutX="132.0" layoutY="97.0" text="Properties File Escaped" textFill="RED" /> 
    </children> 
</AnchorPane> 

结果

Help me fix the third label

正如你所看到的,第三个标签不能正确渲染。

环境:

Java 7的U21,U27,U45,U51,32位和64位。 (JavaFX 2.2.3-2.2.45)

Windows 7 Enterprise,Professional 64位。

UPDATE

我验证过的属性文件 ISO 8859-1

enter image description here

回答

1

大多数IDE(NetBeans的至少)默认情况下,在处理Unicode编码的文件。如果您在NetBeans中创建属性文件并在其中输入日文文本,则输入的文本将自动编码为utf。要看到这个打开记事本(++)的属性文件,你会看到日文字符被转义。
UTF转义等价物“閉じる”为“\u9589\u3058\u308b”,而“\u00e9\u2013\u2030\u00e3\ufffd\u02dc\u00e3\u201a\u2039”为反面的“é–‰ã�˜ã‚‹”。所以图片中的程序输出是正确的。此外,如果您重新打开NetBeans中的jp_test.properties文件,您将看到转义的utf编码文本将被视为已解码。

编辑:按照评论,
它为什么要这样做呢?
这可能是因为您省略了native2ascii的-encoding参数,那么系统的默认字符集可能不是UTF。这可能是该输出的原因。

此外,为什么Java和Swing与我们的属性文件没有问题,因为它们是
但FXML无法处理它?

不能这样,因为“FXML是Java”。唯一的区别也可能是“系统字符集的使用”与“在某个配置位置覆盖字符集”。

无论如何,我建议根据输入文件编码使用native2ascii的正确编码参数。更具体地说,首先将属性文件转换为utf-8编码,然后执行其余的操作。如果您使用NetBeans作为IDE,则不需要native2ascii。

+0

所以,'\ u00e9 \ u2013 \ u2030 \ u00e3 \ ufffd \ u02dc \ u00e3 \ u201a \ u2039'是从Java的''上闭じる'执行native2ascii'工具。它为什么这样做?此外,为什么Java和Swing与我们的属性文件没有问题,但FXML无法处理它? – mawcsco

+0

@mawcsco查看更新。 –

+0

所以,你让我指出了正确的方向。我们从翻译器获得的文件缺少物料清单。添加BOM后,Netbeans和native2ascii都会生成正确的转义字符。 – mawcsco