unicode - 如何使用包含非拉丁字符的 FXML 和属性文件?

标签 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 企业版、专业版 64 位。

更新

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

enter image description here

最佳答案

大多数 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无法处理它?<​​/em>
事实并非如此,因为“FXML 是 Java”。唯一的区别也可能是“系统字符集的使用”与“在某些配置位置覆盖字符集”。

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

关于unicode - 如何使用包含非拉丁字符的 FXML 和属性文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22381757/

相关文章:

java - 如何将 a\n 放入属性文件的值中?

c# - 即时更改 UI 语言

python - locale.setlocale(LC_NUMERIC) : how to make it work on Windows

iphone - NSLocale currentLocale 总是返回 "en_US"而不是用户的当前语言

java - 如何在 Java 中正确计算字符串的长度?

perl - 当我使用 JSON::decode_json 时,Test::Deep::cmp_deeply 中 unicode 字符串的比较失败

java - 访问ehcache.xml中的spring环境变量

java - 如何读取java文件中的local.properties android

c - 输出 unicode wchar_t 字符

mysql - 以某些语言将文本存储在数据库中