JavaFX 多语言 .properties 文件编码

JavaFX multilanguage .properties file encoding

我在显示带有 á、í、č 等变音符号的字符时遇到问题。 我已经使用 ISO 8599-1 将 .properties 文件设置为 UTF-8,但是当我 运行 遵循代码时,我不想要结果。

主要class:

@Override
    public void start(Stage primaryStage) throws Exception{
        FXMLLoader fxmlLoader = new FXMLLoader();
        fxmlLoader.setResources(ResourceBundle.getBundle("bundles.language_sk", new Locale("sk", "SK")));
            Parent root = fxmlLoader.load(getClass().getResource("/view/loginFrame.fxml"));
            primaryStage.setTitle("Login");
            Scene scene = new Scene(root, 563, 580);
            primaryStage.setScene(scene);
            primaryStage.setResizable(false);
            primaryStage.show();
        }

登录框架控制器class:

@Override
    public void initialize(URL location, ResourceBundle resources) {
        ResourceBundle bundle = ResourceBundle
                .getBundle("bundles.language_sk", new Locale("sk", "SK"));
        setLoginBtnText(bundle);
    }

    public void setLoginBtnText(ResourceBundle bundle){
            loginBtn.setText(bundle.getString("loginButton"));
    }

language_sk.properties 文件:

#LOGIN FRAME
.
.
loginButton=Prihlásiť
.
.

结果:

如您所见,我尝试使用 .properties 文件设置登录按钮的文本,但字符乱七八糟。

尽管当我在 setLoginBtnText 方法中使用此代码时:

 public void setLoginBtnText(ResourceBundle bundle){
        String val = bundle.getString("loginButton");
        try {
            loginBtn.setText(new String(val.getBytes("ISO-8859-1"), "UTF-8"));
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

那么按钮上的文字就完全没问题了。如何为我的整个项目设置一些全局编码设置,这样我就不必在每个 class 中的每个组件上指定编码?谢谢。

几件事:

  • "set .properties file to UTF-8 with ISO 8599-1" 没有任何意义。它是 UTF-8 或 ISO 8859-1,而不是两者
  • 您的 属性 文件似乎在磁盘上采用 UTF-8 编码(您可以使用十六进制编辑器进行检查 - 您会看到每个特殊字符有两个字节)
  • 您传递给 ResourceBundle 初始值设定项的语言环境无助于 language/charset 解码,它只是用于 select 正确的捆绑;如果你自己传递 _sk 的名字,那么它可能不需要
  • 根据我的理解,ResourceBundle 默认只理解 ISO 8859-1,我不认为所有 SK 字符都在那里

您需要的是 UTF-8 编码的资源包(您似乎是偶然得到的)并按原样加载它。请在此处查看有关操作方法的说明 How to use UTF-8 in resource properties with ResourceBundle

在我的例子中,我使用的是 FontAwesome 的特殊字符,我使用 UTF-8 字符的转义版本打印它没有问题。

icon.disengage=\uf35d

您必须在4位字符代码前添加“\u”。