JavaFX中的Mojibake(在Netbeans中工作正常)

时间:2016-11-12 21:09:51

标签: netbeans javafx utf-8 mojibake

使用JavaFX在Netbeans中处理一个简单的翻译项目。从Netbeans运行它,它编译和工作完美。没有渲染问题:

appearance when launched from Netbeans

但是当运行相同的可执行文件([project-folder] \ dist \ Translator.jar)时:

mojibake in \dist\Translator.jar

变为乱码。 ([project-folder] \ dist \ run ########## \ Translator.jar)同样的事情:

mojibake in \dist\run##########\Translator.jar

文本可能有四个位置格式错误:将一个术语列表发送给翻译人员,翻译人员使用Web服务检索翻译(1)。然后将它们缓存在文件(2)中,并由解析器(3)加载,这使得数据可用于在JavaFX窗口(4)中显示。我检查了文件并且它们是有效的UTF-8,并且解析器仅在加载现有文件时运行,新部署不会有任何文件。所以我把它缩小到了JavaFX窗口中的显示。

1 个答案:

答案 0 :(得分:0)

对不起,我的问题并不是很棒,但是我遇到过很多有类似问题的人,很难找出我的具体案例。

问题的症结在于,Netbeans会自动执行所有使用UTF-8的JVM会话作为默认编码(据我所知)。通常这不是问题,但是当使用利用UTF-8规范中有争议的代码点的语言时,这可能会保证mojibake将被任何使用UTF-8以外的编码的JVM吐出。这是其中的大多数,因为JVM规范说最佳实践是使用主机系统的编码,这通常不是UTF-8。

问题Java compiler platform file encoding problem帮助我解决了这个问题。由于我无法访问我的代码将运行的每个系统的JVM参数(这看起来不切实际),下面的解决方案是我个人选择的。

/**
 * Converts a string from the system default encoding into UTF-8.
 * This fixes rendering issues for UTF-8 characters where the default
 * encoding would yield mojibake.  Should be run against any Strings that
 * will be displayed to the end user directly that may contain UTF-8
 * characters.
 * 
 * @param string    The String to be re-encoded.
 * @return          the re-encoded string
 */
public static String convertToUTF8(String string){
    return new String(string.getBytes(Charset.defaultCharset()), Charset.forName("UTF-8"));
}

完成工作的简单方法,必要时调用。