プロジェクト

全般

プロフィール

バグ #89

未完了

Scene Builder 10.0.0 及び 11.0.0 Windowsインストーラー版でメニュー(日本語)が化ける

高橋 徹 さんが5年以上前に追加. 約4年前に更新.

ステータス:
進行中
優先度:
通常
担当者:
カテゴリ:
-
開始日:
2018/08/25
期日:
進捗率:

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 8 11以降向けのScene Builder
integration-9
8u-dev
JDK 9以降 8向けのScene Builder

ファイル

garbled-1.png (44.4 KB) garbled-1.png コマンドプロンプト上でビルドしたjarを実行 高橋 徹, 2018/08/26 02:35

関連するチケット 1 (1件未完了0件完了)

関連している バグ #257: Scene Builder 15.0.1 Windowsインストーラー版でメニュー(日本語)が化ける解決高橋 徹2021/02/06

操作

高橋 徹 さんが5年以上前に更新

  • 説明 を更新 (差分)
  • ステータス新規 から 進行中 に変更
  • 進捗率0 から 50 に変更

Scene Builderのソースコードは、2018年3月にOpenJFXリポジトリから削除され、現在はGluon社がGithub上で管理している。
https://github.com/gluonhq/scenebuilder

2018年8月現在、JDK 8対応のScene Builderは、masterブランチで、JDK 9以降対応がintegration-9ブランチで管理されている。

高橋 徹 さんが5年以上前に更新

今回は、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インストーラーを作成している。

高橋 徹 さんが5年以上前に更新

まずは、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

garbled-1.png

ビルドした実行可能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)

高橋 徹 さんが5年以上前に更新

cygwin上でgradlewを実行してみたが、文字化けについては相変わらずであった。

高橋 徹 さんが5年以上前に更新

コマンドプロンプト上で、set DEFAULT_JVM_OPTS="-Dfile.encoding=UTF-8"を指定してビルドしたが文字化けは相変わらずであった。

事後判明したこと

  • 環境変数で指定する場合はJVM_OPTSとする。DEFAULT_JVM_OPTSはgradlew.batの中で使われている変数

高橋 徹 さんが5年以上前に更新

  • 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ファイルを取得
  • コピーしたscenebuilder-11.0.0-all.jarをZIPツールで開く
  • zipで com\oracle\javafx\scenebuilder\app\i18n\ の中にあるファイルを上記ファイルで置換
  • 置換したscenebuilder-11.0.0-all.jar を元の場所へ戻す

高橋 徹 さんが約4年前に更新

  • 対象バージョンコロナウィルス休業期間中 にセット

高橋 徹 さんが約3年前に更新

  • 関連している バグ #257: Scene Builder 15.0.1 Windowsインストーラー版でメニュー(日本語)が化ける を追加

他の形式にエクスポート: Atom PDF