きっかけ
Java Advent Calendarのサンプルコードを実行しようと思ったら、当該事象が発生したので、調べたことメモとして、記録を残す。
環境
バージョン: 1.52.0 (system setup) コミット: 940b5f4bb5fa47866a54529ed759d95d09ee80be 日付: 2020-12-10T22:45:11.850Z Electron: 9.3.5 Chrome: 83.0.4103.122 Node.js: 12.14.1 V8: 8.3.110.13-electron.0 OS: Windows_NT x64 10.0.18363
$ java -version openjdk version "15.0.1" 2020-10-20 OpenJDK Runtime Environment (build 15.0.1+9-18) OpenJDK 64-Bit Server VM (build 15.0.1+9-18, mixed mode, sharing)
ソース
import jdk.jfr.consumer.*; import java.time.*; public class Test { public static void main(String[] args) throws InterruptedException { try (var rs = new RecordingStream()) { // イベントの購読を登録 rs.enable("jdk.CPULoad").withPeriod(Duration.ofSeconds(1)); rs.onEvent("jdk.CPULoad", event -> { System.out.println("jdk.CPULoad: " + event.getFloat("machineTotal")); }); rs.startAsync(); // サーバ的な処理 long cnt = 0; while (true) { Thread.sleep(1000); System.out.println("本来はここでなんかサーバの処理: " + (cnt++)); } } } }
事象
$ javac Test.java Test.java:7: エラー: この文字(0x81)は、エンコーディングwindows-31jにマップできません // 繧、繝吶Φ繝医?ョ雉シ隱ュ繧堤匳骭イ ^ Test.java:14: エラー: この文字(0x86)は、エンコーディングwindows-31jにマップできません // 繧オ繝シ繝千噪縺ェ蜃ヲ逅? ^ Test.java:18: エラー: この文字(0x81)は、エンコーディングwindows-31jにマップできません System.out.println("譛ャ譚・縺ッ縺薙%縺ァ縺ェ繧薙°繧オ繝シ繝舌?ョ蜃ヲ逅?: " + (cnt++)); ^ Test.java:18: エラー: この文字(0x86)は、エンコーディングwindows-31jにマップできません System.out.println("譛ャ譚・縺ッ縺薙%縺ァ縺ェ繧薙°繧オ繝シ繝舌?ョ蜃ヲ逅?: " + (cnt++)); ^ エラー4個
エンコードの問題ってのはすぐに分かったけど、対応方法がぱっと思いつかなかった。
解決方法
javac -encoding UTF-8 Scores.java
勝手にエンコード判定してコンパイルしてくれないものだろうか。。。
所感
こういうの、かなり手間だなとは思った。