Javaのエンコーディング指定方法

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を指定するほうが確実に動作します。