java + gradle コンパイルエラー”unmappable character (0x81) for encoding windows-1252”

起きたこと

以下のように日本語(ひらがな)のcharを表示してみようとしたら、タイトルにあるコンパイルエラーが発生した。

System.out.print('あ');

どうやら自分が使っているマシンが英語版のWindowsのため、文字コード(で言葉合ってるのかいつもわらかなくなる)がwindows-1252らしい(Latain-1の拡張的な?)。これに起因したエラーのよう。 テーブル見てみると0x81 はたしかに定義されてないかった。こんな歯抜けあるだなぁ。

起きていることは、本当はUTF-8エンコーディングしたファイルなのに、コンパイル環境(今回はintelliJ + Gradle)がwindows-1252でコンパイルしようとしている?みたいな感じだと思われる。

Complete Character List for windows-1252

やったこと

javacでコンパイルしてみる

とりあえず、原因切り分けのため、windowsターミナル上でjavacコマンドでコンパイルしてみた。

この場合はエラーが発生せずにコンパイル成功してしまった。実行もできて、まごうことなき「あ」が表示された。

以下のstackoverflowの回答にある通りに、 encoding オプションをつけたら通るようになったりするのかなと思ったが、何もつけずに通ってしまった。

"unmappable character for encoding" warning in Java

でもよく考えたら、Window terminalといってもUbuntu環境だったので、デフォルトのencodingがutf8だったので通っていた。-encodingつけない場合はプラットフォームに依存するようなので、まあそのとおりの結果だった。

❯ echo $LANG
C.UTF-8
-encoding encoding
Specifies character encoding used by source files, such as EUC-JP and UTF-8. If the -encoding option is not specified, then the platform default converter is used.

intelliJでjavacコンパイルオプションつけてみる 🙅🏻

設定でJavac Options欄のAdditional command line parametersに追加してみたが、結果変わらず。

どうやらGradleビルドのコンパイルにはこの設定は反映されないようだった。残念。

build.gradleにコンパイルオプションつけてみる 🙆🏻‍♂️

以下のissueに書いてある方法でutf8を指定するとコンパイルエラーは解消されましたとさ。

ただ、実行するとintelliJのターミナルで「あ」が表示されないので、あとはintelliJも何かしらの設定が必要みたい。だるい。

https://github.com/shekhargulati/strman-java/issues/99

IntelliJの設定変更 🙆🏻‍♂️

以下の記事のとおり、Dfile.encoding=UTF-8を設定し再起動後にもう一度実行すると、「あ」が表示された。

https://www.purin-it.com/spring-boot-crud-3#:~:text=解決方法,起動すれば解決できる。

文字コード系っていろんなところで設定されていて、どこが効いているのかよくわからないから、だるいです。