発生した問題
文字コードがUTF-8のutf8-in.txt
というファイルがあります。内容は以下の通りです。
utf8-in.txt
あいうえお
かきくけこ
Main.java
はutf-in.txt
をすべて読み込み、内容を修正。それをout.txt
に出力します。
Main.java
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
public class Main {
public static void main(String[] args) throws IOException {
byte[] bytes = Files.readAllBytes(Paths.get("utf8-in.txt"));
String content = "@@@" + new String(bytes) + "@@@";
Files.write(Paths.get("out.txt"), content.getBytes());
}
}
これをEclipseから実行します。
すると想定通り、out.txt
が作成されます。
次にこのプロジェクトをsample.jar
としてエクスポートし、cmd上から実行します。
D:\temp>java -cp sample.jar Main
処理は正常に終了しますが、作成したout.txt
は文字化けを起こしました。
原因
原因はEclipseとcmdでJVMのデフォルトの文字コードが違うことです。
まずEclipseではUTF-8が利用されます。
対して、cmdではMS932が利用されます。
D:\temp>jshell
| JShellへようこそ -- バージョン17.0.8.1
| 概要については、次を入力してください: /help intro
jshell> System.getProperty("file.encoding");
$1 ==> "MS932"
対応方法
対応方法としてはデフォルトの文字コードを適切に設定することです。今回はcmdで実行する際の文字コードをUTF-8にしました。
java -Dfile.encoding=UTF-8 -cp sample.jar Main
環境情報
D:\temp>java -version
openjdk version "17.0.8.1" 2023-08-24
OpenJDK Runtime Environment Temurin-17.0.8.1+1 (build 17.0.8.1+1)
OpenJDK 64-Bit Server VM Temurin-17.0.8.1+1 (build 17.0.8.1+1, mixed mode, sharing)