バグ #89
未完了Scene Builder 10.0.0 及び 11.0.0 Windowsインストーラー版でメニュー(日本語)が化ける
50%
説明
Scene Builder 10.0.0 および 11.0.0 Windowsインストーラー版(Gluon社のビルド・公開版)をインストールし実行すると、メニューが文字化けしている。
GluonのGithubのバグチケットは次
https://github.com/gluonhq/scenebuilder/issues/194
Scene Builderのソースコードは、Gluon社のGithubリポジトリ
https://github.com/gluonhq/scenebuilder
ブランチ名 | 説明 |
---|---|
master | JDK |
8u-dev |
JDK |
ファイル
高橋 徹 さんが6年以上前に更新
今回は、Scene Builder 10.0.0(JDK10対応)での問題を究明するので、integration-9ブランチをクローンして調査する。
GluonアレンジのScene Builderは、Gradleをビルドツールとして使う。Gradleの設定を見る限り、ネイティブバンドル用のビルドはなさそうだ。
masterブランチ(JDK 8用)を見ると、次のようなネイティブバンドル用のコマンドやリソースがある。
scenebuilder +-- .ci | +-- build.bat | +-- build.sh | +-- linux.sh | +-- osx.sh | +-- windows.bat +-- app | +-- assets | +-- linux | | +-- icon-linux.png | +-- osx | | +-- icon-mac.icns | +-- windows | +-- icon-windows.ico | +-- SceneBuilder-setup-icon.bmp | +-- SceneBuilder-x64.iss +-- appveyor.yml
.ci\windows.bat の中では、javapackagerを実行してInno Setupツールを使ったWindowsインストーラーを作成している。
高橋 徹 さんが6年以上前に更新
- ファイル garbled-1.png garbled-1.png を追加
まずは、Windows 10 日本語版、JDK 10.0.2 でコマンドプロンプト上でビルド、生成された実行可能JARファイルを実行したところ文字化けが発生した。
C:\work\scenebuilder> gradlew -PVERSION=10.0.0 clean build :
C:\work\scenebuilder\app\build\libs\scenebuilder-10.0.0-all.jar
ビルドした実行可能JARファイルの中に含まれる日本語プロパティファイル(com/oracle/javafx/scenebuilder/app/i18n/SceneBuilderApp_ja.properties)の中身(メニューのファイルのプロパティを抜粋)
menu.title.file = \u7e5d\u8f14\u3043\u7e67\uff64\u7e5d\uff6b(F)
Gluonサイトで配布されている実行可能JARファイルの中に含まれる日本語プロパティファイルから同行抜粋
menu.title.file = \u30d5\u30a1\u30a4\u30eb(F)
ということで、文字化け発生している。JShellでそれぞれのユニコードエスケープ文字列を表示させてみると
jshell> System.out.println("\u30d5\u30a1\u30a4\u30eb(F)") ファイル(F) jshell> System.out.println("\u7e5d\u8f14\u3043\u7e67\uff64\u7e5d\uff6b(F)") 繝輔ぃ繧、繝ォ(F)
文字化けのパターンは、UTF-8の文字列をSJISとして解釈した場合に一致する。
再現方法の1つは、UTF-8で「ファイル(F)」と記述したファイルを作成し、コマンドプロンプト上でtypeで中身を表示させる。
C:\work> type file.txt 繝輔ぃ繧、繝ォ(F)
なお、ソースファイル上のプロパティファイルは、UTF-8で記述されている(ユニコードエスケープなし)。
Javaでは、java.io.FileReaderクラスを使ってデフォルトエンコーディング(Windows上であればSJIS系のWindows_31J)でUTF-8を読み込むと上述の様に化ける。
jshell> var reader = new BufferedReader(new FileReader("file.txt")) reader ==> java.io.BufferedReader@13deb50e jshell> System.out.println(reader.readLine()) 繝輔ぃ繧、繝ォ(F)
高橋 徹 さんが6年以上前に更新
- app/build.gradle の次の記述
filter(EscapeUnicode)
これは、書籍「Gradle徹底入門」によれば
EscapeUnicodeによるフィルタはエンコーディング指定に対応していないため、デフォルトエンコーディング以外で記述されているプロパティファイルを正しく扱えません。この場合はシステムプロパティfile.encodingでエンコーディングを指定した上で前述のfilter()を適用する必要があります。何らかの事情によりシステムプロパティでエンコーディング指定ができない場合は、Antのnative2asciiタスクを利用します。・・・
とあるので、Windows日本語環境でビルドするときは、プロパティファイルがUTF-8だとうまく使えません。
gradlew.bat の次の行でエンコーディングをUTF-8指定します。
-set DEFAULT_JVM_OPTS=
+set DEFAULT_JVM_OPTS=-Dfile.encoding=UTF-8 -Duser.language=en
高橋 徹 さんが5年以上前に更新
- 題名 を Scene Builder 10.0.0 Windowsインストーラー版でメニュー(日本語)が化ける から Scene Builder 10.0.0 及び 11.0.0 Windowsインストーラー版でメニュー(日本語)が化ける に変更
- 説明 を更新 (差分)
Scene Builder 11.0.0 Windowsインストーラー版の日本語文字化け回避手順
- Scene Builder 11.0.0をインストール
- インストールディレクトリ下のapp\scenebuilder-11.0.0-all.jar を作業用ディレクトリへコピー
- Scene Builderのリポジトリから、
SceneBuilderApp_ja.properties
ファイルを取得- https://github.com/gluonhq/scenebuilder
- app/src/main/resources/com/oracle/javafx/scenebuilder/app/i18n/
- コピーしたscenebuilder-11.0.0-all.jarをZIPツールで開く
- zipで com\oracle\javafx\scenebuilder\app\i18n\ の中にあるファイルを上記ファイルで置換
- 置換したscenebuilder-11.0.0-all.jar を元の場所へ戻す