TL;DR
環境変数の JAVA_TOOL_OPTIONS
に -Dfile.encoding=UTF-8
を設定する。
詳細
GARMIN FIT SDKでカスタムメッセージ等を定義した場合、FitGen.exeを実行しFIT SDKを生成する必要がある。
https://developer.garmin.com/fit/cookbook/fitgen/
しかし、最近Garmin Developersで配布されているFIT SDKのEventMesg.javaのドキュメントコメントに謎の文字化けが混入しておりそのままFitGen.exeを実行すると
> .\FitGen.exe -o test -java
FIT Code Generator - Protocol 2.00 Profile 21.40Release
SDK Version: production/akw/21.40.00-0-g813c158
Parsing existing config.csv...
Writing new config.csv...
Generating Java code...
Building Java tools...0%
com\garmin\fit\EventMesg.java:679: エラー: この文字は、エンコーディングMS932にマップできません
* Comment: Theテつ?firstテつ?byteテつ?isテつ?theテつ?radar_threat_level_max, theテつ?secondテつ?byteテつ?isテつ?theテつ?radar_threat_count, and theテつ?lastテつ?16テつ?bitsテつ?areテつ?reservedテつ?forテつ?futureテつ?useテつ?andテつ?shouldテつ?beテつ?setテつ?toテつ?FFFF.
^
以下略
というエラーが発生し、ビルドに失敗する。
この文字は、エンコーディングMS932にマップできません
というエラーはjavacにUTF-8等適切なエンコーディングを渡してやることで回避することが可能。以下のようなオプションを渡すことで回避できる。
javac -encoding UTF-8 EventMesg.java
しかしFitGen.exeの場合、javac呼び出し部分はFitGen.exe内部で行われているので直接javacにオプションを渡すことができない。
そこでFitGen.exeを実行するWindowsのユーザー環境変数にJAVA_TOOL_OPTIONSを追加し、javacに渡したいオプションを指定することでエラーを回避することができる。
https://docs.oracle.com/javase/jp/8/docs/technotes/guides/troubleshoot/envvars002.html
https://qiita.com/n_slender/items/6c566bb345e844ba8127