【问题标题】:Mojibake in JavaFX (works fine in Netbeans)JavaFX 中的 Mojibake(在 Netbeans 中运行良好)
【发布时间】:2016-11-12 21:09:51
【问题描述】:

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

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

Mojibake。 ([project-folder]\dist\run##########\Translator.jar) 也是一样的:

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

【问题讨论】:

  • 文件编码可能是有效的UTF-8,但是jvm使用的默认编码可能与UTF-8不同,程序中的编码可能没有正确指定...
  • @fabian 如何强制使用 UTF-8 作为默认值?我认为 Java 的原则是它在任何地方都可以工作。
  • 最好为您用来读取这些文件/webservice 的任何内容指定编码。简短的描述和/或代码示例可能会有所帮助(在问题本身中发布代码 minimal reproducible example,而不仅仅是代码的链接。使用 System.out 可能足以证明问题。)。
  • @fabian 对代码示例感到抱歉;它太集成了,无法真正隔离它。比特定用例解决方案更感兴趣的是查看是否有其他人遇到过这个问题(就像大多数 StackExchange 答案一样)。终于找到了解决办法,回答了我自己的问题。

标签: netbeans javafx utf-8 mojibake


【解决方案1】:

很抱歉,我的问题不是很好,但我遇到过很多人有类似的问题,很难为我的具体情况隔离开来。

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

一个完成工作的简单小方法,根据需要调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-18
    • 1970-01-01
    • 1970-01-01
    • 2014-12-25
    • 2021-12-24
    • 1970-01-01
    相关资源
    最近更新 更多