JavaFx 中文乱码问题解决

JavaFx 中文乱码问题解决

接用户报告使用 PeerBanHelper 时,使用 JavaFx 的 GUI 界面出现中文乱码,但 Swing 的 GUI 界面则没问题。 用户自行报告安装了多个字体整合包,并且同样使用 JavaFx 的 HMCL 启动器也出现乱码。由于其它也使用 JavaFx GUI 的用户没有出现这个问题,且

接用户报告使用 PeerBanHelper 时,使用 JavaFx 的 GUI 界面出现中文乱码,但 Swing 的 GUI 界面则没问题。

用户自行报告安装了多个字体整合包,并且同样使用 JavaFx 的 HMCL 启动器也出现乱码。由于其它也使用 JavaFx GUI 的用户没有出现这个问题,且我也无法在本地复现,排除 PBH 自己的问题,多半这个锅得甩给字体整合包。

E0F520877040BE31DAF9D8340D1317C0.png

CDEBBEC5420CB6833783E156A4DDCA36.png

PeerBanHelper 并没有单独配置字体,因此 JavaFx 根据系统默认使用了默认中文字体微软雅黑。那么现在需要确定是不是微软雅黑的锅。现在指定 ListView 的字体为 Consolas, Monospace,可以看到单独指定了字体的 ListView 没有此字体问题。

让用户(左图)看了一眼微软雅黑的字体文件属性:

可以看到版本号、版权信息都不同。

从正常的同版本 Windows 系统上复制一份 C:\Windows\Fonts 文件夹到问题设备上,然后全选右键,安装(for all users),为所有用户安装(不要选为当前用户安装,用带 UAC(小盾牌)标志的选项)。如果此时整个系统界面都已经乱码,使用开始菜单盲打 “语言”,快速进入语言菜单,先将系统切换到英语语言再操作。安装后注销重新登录即可解决问题。

如果用户无法执行这些操作,可以通过 CSS 手动设置 JavaFx 到其它字体,例如等线或者SimSun-ExtB(宋体),虽然那叫一个丑,但是最起码绕过了乱码问题。

* {
    -fx-font-family: "SimSun-ExtB"
}
Stage st = MainJavaFx.getStage();
st.getScene().getRoot().getStylesheets().add(Main.class.getResource("/javafx/css/root.css").toExternalForm());

除特殊说明以外,本站原创内容采用 知识共享 署名-非商业性使用 4.0 (CC BY-NC 4.0) 许可。转载时请注明来源,以及原文链接。
Comment