起きたこと
以下のように日本語(ひらがな)の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=解決方法,起動すれば解決できる。
文字コード系っていろんなところで設定されていて、どこが効いているのかよくわからないから、だるいです。