Javaソースコード中に埋め込まれた文字列が、実際にコンパイルされると内部で本当にUTF-8になるのか確認してみる。
プラットフォームはWindowsXP + JDK 1.5
EncodingSJIS.java: public class EncodingSJIS { public static void main(String[] args) { System.out.println("ShiftJISの日本語表示文字列です。"); } }
DOS> javac -encoding Shift_JIS EncodingSJIS.java DOS> java -cp . EncodingSJIS ShiftJISの日本語表示文字列です。
public class EncodingEUC { public static void main(String[] args) { System.out.println("EUC-JPの日本語表示文字列です。"); } }
DOS> javac -encoding EUC-JP EncodingEUC.java DOS> java -cp . EncodingEUC EUC-JPの日本語表示文字列です。
拡張子を.txtにして(しなくとも良いが)、UTF-8に対応したエディタで文字コードをUTF-8で指定して開いてみる。
いずれも、文字コードがUTF-8としてエディタに認識され(*1)、実際に日本語文字列が読み込めている。
以上より、 -encoding オプションをコンパイル時に指定することによりプラットフォームのデフォルトでない文字コードでも、クラスファイルコンパイル時にUTF-8に変換されて内部表現されることが分かった。
では、あえて-encodingで間違ったエンコーディングを指示するとどうなるか?
上図のように、コンパイル時に文字コードの検出で警告が表示されるが、クラスファイルは生成される。また、実行すると文字化けしていることが分かる。
実際にクラスファイルをエディタで開いてみると、下図のようになり、エディタの文字コードの自動認識も失敗していることが分かる。
どうでもいいですが、文字コードとエンコーディングをもうちょっと意識して使い分けたいです。勉強しなくちゃ・・・。