2016-11-12 5 views
0

JavaFXを使用したNetbeansの単純なトランスレータプロジェクトで作業しています。 Netbeansから実行すると、コンパイルされ、完全に動作します。ノーレンダリングの問題:JavaFXのMojibake(Netbeansでうまく動作します)

appearance when launched from Netbeans

しかし、同じ実行ファイル([プロジェクトフォルダ] \ distの\ Translator.jar)実行している場合:

mojibake in \dist\Translator.jar

文字化けを。

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

テキストがmisformattedすることができ4つの場所があります:リスト([プロジェクトフォルダ] \のdist \ラン########## \ Translator.jar)についても同じこと用語を翻訳者に送信します。翻訳者は、Webサービスを使用して翻訳を取得します(1)。これらはファイル(2)にキャッシュされ、パーサー(3)によってロードされ、JavaFXウィンドウ(4)に表示できるようになります。私はファイルを検査したが、有効なUTF-8であり、パーサーは既存のファイルをロードしているときにのみ実行され、新しいデプロイメントには存在しない。そこで、JavaFXウィンドウの表示に絞ってみました。

+1

ファイルのエンコードは有効なUTF-8でもかまいませんが、jvmで使用されるデフォルトのエンコーディングはUTF-8と異なる場合があり、プログラムのエンコーディングが正しく指定されない場合があります... – fabian

+0

@fabianデフォルトとしてUTF-8?私は、Javaの原則はどこでも同じように動作すると考えていました。 – ndm13

+0

これらのファイル/ webserviceの読み込みに使用するエンコードをよりよく指定します。簡単な説明やコードサンプルが参考になるかもしれません(コードへのリンクだけではなく、質問自体に[mcve]コードを投稿してください)。おそらく 'System.out'を使用すれば問題を実証することができます。 – fabian

答えて

0

ご迷惑をおかけして申し訳ございませんが、似たような問題を抱えた多くの人が出てきました。

問題の要点は、Netbeansが自動的にUTF-8を使用するすべてのJVMセッションをデフォルトエンコードとして実行することです(私が知る限り)。通常はこれは問題ではありませんが、UTF-8仕様内で紛争のあるコードポイントを利用する言語を扱う場合、UTF-8以外のエンコーディングを使用するJVMでmojibakeが生成される可能性があります。 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")); 
} 

必要に応じて呼び出される、簡単な方法です。

関連する問題