Java - 文字コード

文字コード

Java の文字コードは内部的に Unicode を使用しています。ただし、プログラムをコンパイルする場合や、プログラムを実行した時に出力を行う場合は file.encoding プロパティに設定されたエンコーディングが使用されます。つまり、コンパイルする場合にはソースファイルのエンコーディングを file.encoding プロパティのエンコーディングで読み込み、その後で Unicode に変換します。プログラムから出力する場合も同様に、Unicode から file.encoding プロパティのエンコーディングに変換して出力されます。

デフォルトエンコーディング

デフォルトのエンコーディングは、環境によって異なります。デフォルトのエンコーディングを確認するには file.encoding プロパティに設定されているエンコーディングを出力することで確認できます。

class test{
  public static void main(String[] args){
    System.out.println(System.getProperty("file.encoding"));
  }
}
デフォルトエンコーディングの確認

Windows 10 の環境では MS932 が表示されます。MS932 は Shift_JIS を拡張したエンコーディングであり、プログラムに日本語が含まれていても問題ありません。プログラムに日本語が含まれる場合は、文字コードを Shift_JIS として保存してください。もしも、他の文字コード (例えば UTF-8 など) で保存した場合、コンパイルは問題なく通りますが、出力時に文字化けする原因となります。

コンパイル時のエンコーディング指定

デフォルトエンコーディング以外のエンコーディングを使ってソースファイルを保存した場合、コンパイル時にエンコーディングを指定する必要があります。コンパイル時にエンコーディングを指定するには javac コマンドの -encoding オプションを使います。

javac -encoding エンコーディング名 ソースファイル名.java
コンパイル時のエンコーディング指定

エンコーディング名にはソースファイルを保存した時のエンコーディングを指定してください。具体的な指定方法としては、以下のようになります。

javac -encoding UTF-8 sample.java
コンパイル時のエンコーディング指定

指定できるエンコーディングの一覧は、Supported Encodings から確認することができます。(JDK 14)

実行時のエンコーディング指定

画面に出力するプログラムの場合、デフォルトエンコーディングが使用されます。ただし、出力先のエンコーディングがデフォルトエンコーディングとは異なる場合には、プログラム実行時に使用するエンコーディングを指定する必要があります。

Java ではデフォルトのエンコーディングが file.encoding プロパティに設定されており、プログラムから出力する場合にもデフォルトエンコーディングが使われます。そのため、出力先のデフォルトエンコーディングとは異なるエンコーディングが使用されている場合、使用するエンコーディングを指定しなければ文字化けを起こす原因となります。

Java のプログラム実行時にエンコーディングを指定するには java コマンドの -D<name>=<value> オプションを使用して file.encoding プロパティに別のエンコーディングを設定します。

java -Dfile.encoding=エンコーディング名 クラスファイル名
実行時のエンコーディング指定

実行環境のエンコーディングが UTF-8 を使用している場合は、次のようにエンコーディングを設定してプログラムを実行します。

java -Dfile.encoding=UTF-8 sample
実行時のエンコーディング指定

Windows のコマンドプロンプトでは、デフォルトエンコーディングは MS932 が使用されています。コマンドプロンプトのデフォルトエンコーディングを確認するためには chcp コマンドを実行します。もしも、コマンドプロンプトのデフォルトエンコーディングが UTF-8 などに変更されている場合、エンコーディングを指定しなければ文字化けを起こす原因となります。

関連記事