如何将FXML和属性文件与非拉丁字符一起使用?

时间:2014-03-13 14:29:22

标签: unicode properties internationalization javafx-2

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

在我对问题的调查中,我发现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位。

更新

我已验证属性文件 ISO 8859-1

enter image description here

2 个答案:

答案 0 :(得分:1)

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

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

另外,为什么Java和Swing对我们的属性文件没有任何问题,因为它们是, 但FXML无法处理它?<​​/ em>
情况并非如此,因为&#34; FXML是一个Java&#34;。唯一的区别也可能是&#34;系统字符集的使用&#34; vs&#34;在某些配置位置覆盖charset&#34;。

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

答案 1 :(得分:0)

属性文件应为ISO 8859-1编码,而不是UTF-8。

可以使用\uXXXX转义字符。

NetBeans等工具默认执行此操作,AFAIK。

http://docs.oracle.com/javase/7/docs/api/java/util/Properties.html

http://docs.oracle.com/javase/tutorial/i18n/text/convertintro.html