JavaFX 中的 Mojibake(在 Netbeans 中运行良好)

Mojibake in JavaFX (works fine in Netbeans)

使用 JavaFX 在 Netbeans 中开发一个简单的翻译器项目。 运行 它来自 Netbeans,可以完美编译和运行。没有渲染问题:

但是当运行相同的可执行文件([项目文件夹]\dist\Translator.jar)时:

莫吉巴克。同样的事情 ([project-folder]\dist\run##########\Translator.jar):

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

中的显示

很抱歉,我的问题不是很好,但我遇到过很多人有类似的问题,很难找出我的具体情况。

问题的症结在于 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"));
}

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