Mark Hammer's Blog

SalesforceやTrailheadに関する情報を投稿しているブログです。

Java18以降の環境でDataLoaderにてShift-JISを扱う方法

はじめに

2022/9に、Salesforceヘルプ:Zulu 18 以降をインストールすると、Windows 版のデータローダで文字化けが発生というヘルプが公開されました。
これはShift-JISのCSVファイルを使用すると文字化けが発生する、というもので、Java18以降のバージョンにて文字セットの指定がない場合、UTF-8をデフォルトの文字セットとして扱うという動作変更が原因です。
Java全体ではこの動作変更により「動作環境によってデフォルトの文字コードがバラバラな状態から固定できる」というメリットがあるようですが、DataLoaderでは起動時に文字セットの指定を行っていないため、Java18以降の環境ではDataLoaderはUTF-8以外は扱えない動作となりました。

現在、DataLoaderの動作環境はJava11以降となっているため、引き続きShift-JISのCSVを使用したい場合はJava11を使用する、というのがSFDCの見解のようですが、Java18以降でもこれまで通りDataLoaderを動作させる方法はないのか調査したところ、 -Dfile.encoding=COMPAT というオプションを付与することでこれまでと同様の動作にできるとのことでした。
ここではDataLoaderで -Dfile.encoding=COMPAT を使う方法と動作確認結果を書いていきます。

オプション付与の方法

環境変数を追加する

Java実行時にオプションを追加するための環境変数として JAVA_TOOL_OPTIONS があります。
この環境変数を使用して、DataLoader起動時に -Dfile.encoding=COMPAT オプションを追加します。
具体的にはコントロールパネル→システム→システムの詳細設定→環境変数の順にアクセスし、システム環境変数に以下の形で追加します。

システム変数として追加

追加した後にDataLoaderを起動すると、コマンドプロンプト(背景が黒い画面)に以下のようにオプションが設定されたことを表す文言が表示されます。

環境変数追加後のDataLoader起動画面

環境変数が追加できない、同じPCでJavaでの開発を行うので影響されたくないなどの理由がなければこちらの利用をお勧めします。

DataLoader起動用batファイルに記載する

DataLoaderとJavaを別にインストールするようになってから、DataLoaderインストールフォルダには dataloader.bat というDataLoader起動用ファイルが存在します。
そのファイルの中にある、 java から始まる行に -Dfile.encoding=COMPAT オプションを以下のように直接書き込みます。

DataLoader Ver56 でのdataloader.bat書き換え

こちらの場合、書き換える場所が分かりにくい*1、DataLoaderの新しいバージョンをインストールするごとに書き換えないといけないという問題があるため、環境変数追加の対応が難しい方のみ行うのがよいかなと思います。

動作確認

ここでは、 -Dfile.encoding=COMPAT オプション有無による動作の違いを確認します。

環境

  • OS: Windows11
  • Java: Zulu OpenJDK バージョン 19.0.1
  • DataLoader: バージョン 56.0.6

動作結果

Export

DataLoaderのオプション、 -Dfile.encoding=COMPAT オプションの有無とExportで出力される文字コードの一覧です。

DataLoaderオプション Javaオプションなし 環境変数追加 dataloader.bat編集
Write all CSVs with UTF-8 encoding 有効 UTF-8 UTF-8 UTF-8
Write all CSVs with UTF-8 encoding 無効 UTF-8 Shift-JIS Shift-JIS
Insert

〇はインポート後のSalesforce側の文字が正常なこと、×は文字化けしたことを表します。

  • CSVにShift-JISを使用
DataLoaderオプション Javaオプションなし 環境変数追加 dataloader.bat編集
Read all CSVs with UTF-8 encoding 有効 × × ×
Read all CSVs with UTF-8 encoding 無効 ×
  • CSVにUTF-8を使用
DataLoaderオプション Javaオプションなし 環境変数追加 dataloader.bat編集
Read all CSVs with UTF-8 encoding 有効
Read all CSVs with UTF-8 encoding 無効 × ×

まとめ

動作結果から、以下が分かりました。

  • Java18以降でJavaオプション -Dfile.encoding=COMPAT がない場合、"Read/Write all CSVs with UTF-8 encoding"オプションは意味をなさず、全てUTF-8で処理される
  • Javaオプション -Dfile.encoding=COMPAT を追加してDataLoaderを起動した場合、これまで通り"Read/Write all CSVs with UTF-8 encoding"オプションにチェックがなければShift-JIS、あればUTF-8で処理される

現状、このような面倒なことを考えずに済むJava11の利用をお勧めしますが、どうしてもJava18以降を使用しないといけないなどの事情がある場合は本投稿を参考にしていただければ幸いです。

参考資料

qiita.com

mail.openjdk.org

openjdk.org

www.gwtcenter.com

docs.oracle.com

*1:DataLoader Ver53のdataloader.batのコードは上記キャプチャと異なりました