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”。
我在显示带有 á、í、č 等变音符号的字符时遇到问题。 我已经使用 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”。