エンターテイメント!!

遊戯王好きのJavaエンジニアのブログ。バーニングソウルを会得する特訓中。

Javaでコンパイル時に「エンコーディングwindows-31jにマップできません」が発生

きっかけ

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

勝手にエンコード判定してコンパイルしてくれないものだろうか。。。

所感

こういうの、かなり手間だなとは思った。

参考サイト

Java コンパイルエラー エンコーディングwindows-31jにマップできません - Qiita