使用JavaFX在Netbeans中处理一个简单的翻译项目。从Netbeans运行它,它编译和工作完美。没有渲染问题:
但是当运行相同的可执行文件([project-folder] \ dist \ Translator.jar)时:
变为乱码。 ([project-folder] \ dist \ run ########## \ Translator.jar)同样的事情:
文本可能有四个位置格式错误:将一个术语列表发送给翻译人员,翻译人员使用Web服务检索翻译(1)。然后将它们缓存在文件(2)中,并由解析器(3)加载,这使得数据可用于在JavaFX窗口(4)中显示。我检查了文件并且它们是有效的UTF-8,并且解析器仅在加载现有文件时运行,新部署不会有任何文件。所以我把它缩小到了JavaFX窗口中的显示。
答案 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"));
}
完成工作的简单方法,必要时调用。