Javaコードをコンパイルしたり実行したりするときのエンコーディングの指定方法について説明します。
はじめに
Javaコードを作成してファイル保存するときに、多くのエディターでエンコーディングのデフォルトが最近ではUTF-8になっていると思います。
それはほとんどのプログラム言語でソースファイルの作成はUTF-8が推奨されているからです。
ですが、Windowsの日本語環境は今なおデフォルトのエンコーディングがShift-JISです。
そしてJavaは動作するシステムの環境に合わせてエンコーディングが設定されます。
なので、WindowsでUTF-8でソースファイルを作成して、そのままコンパイルしたり実行するとコードに日本語を使っていると文字化けします。
そこでエンコーディングを指定してコンパイルしたり実行する方法を説明します。
指定方法
まずJavaは動作時のエンコーディングがfile.encodingプロパティに設定されています。
なのでこの設定がShift-JISで、ソースコードがUTF-8で書かれていると文字化けします。
そのエンコーディングをコンパイルや実行時に指定すると、ソースコードのエンコーディングと一致して正しく動作します。
書き方は次のようになります。
【コンパイル時に指定】
javac -encoding <エンコーディング名> <ソースファイル名>
例えば、Windowsの環境で作業するときの例です。
次のコードを作成しUTF-8でSample.javaとして保存します。
class Sample {
public static void main(String[] args) {
System.out.println("こんにちは");
}
}
Windowsでこのソースコードをエンコーディング指定なしにコンパルするとエラーになりませんが、実行時に文字化けします。
コードによってはコンパイル時にエラーになることもあります。
なので、次のようにエンコーディングを指定してコンパイルします。
PS C:\Users\user> javac -encoding UTF-8 Sample.java
PS C:\Users\user> java Sample
こんにちは
これで文字化けなく日本語が出力できました。
また、JDK11以降はコンパイルせずソースコードを直接インタープリターが実行できるようになっています。
例えば、
PS C:\Users\user> java Sample.java
縺薙s縺ォ縺。縺ッ
というように直接ソースファイルを実行することができますが、日本語は文字化けします。
先程のようにエンコーディングのオプションを付けて実行できそうに思いますが、
PS C:\Users\user> java -encoding UTF-8 Sample.java
Unrecognized option: -encoding
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
このように、エラーになってしまいます。
そこで、システム環境変数に次の設定をすることでエンコーディングを指定せずに実行することができます。
Windowsのシステム環境設定は次のように設定します。
Windowsメニューの設定をクリックし、検索フィールドに「環境変数」と入力すると以下の項目が表示されます。
「システム環境変数の編集」を選択します。
するとシステムのプロパティ画面が表示されます。
「環境変数」ボタンを押します。
すると環境変数画面が表示されます。
画面下のシステム環境変数の「新規」ボタンを押します。
表示される新しいシステム変数画面で、以下の内容を入力します。
変数名:JAVA_TOOL_OPTIONS
変数値:-Dfile.encoding=UTF-8
「OK」を押して終了し、Windowsを再起動します。
再起動したら、再びSample.javaコードを実行します。
PS C:\Users\user> java Sample.java
こんにちは
今度は正しく「こんにちは」と表示されたと思います。
これで、コンパイルする際もエンコーディングを指定する必要がなくなっています。
PS C:\Users\user> javac Sample.java
PS C:\Users\user> java Sample
こんにちは
このようにシステム環境変数を設定しておくと、デフォルトでコンパイルと実行のエンコーディングがUTF-8となるので、ソースコードはUTF-8で記述できるわけです。
JAVA_TOOL_OPTIONS環境変数は注意が必要です。
変数に代入されたデータは正しくエンコードされない場合があります。例えば、次のようなコードの場合、
String s = new java.util.Scanner(System.in).nextLine();
System.out.println("入力したのは「"+s+"」です");
入力したのは「??????????」です
少し面倒でもuft-8で記述するコード内で日本語を使用する場合はコンパイル時にエンコードオプションでutf-8を指定するほうが確実に動作します。