Java SE 6で文字コードについて考える UTF-8で揃えとくか...

文字コードUTF-8Javaソースコードコンパイル

javac -encoding=utf-8 test2.java  ※前回のアップデート後から使えなくなった
javac -J-Dfile.encoding=utf-8 test2.java
文字コードUTF-8Javaコードを実行する
java -Dfile.encoding=utf-8 test2

とにかく色々な言語に触れてみるってな感じで、ここ数年間で数多く学んできたつもりですが、気が付くとJavaに戻ってきてたりします。処理が遅くて放り投げたあの日...なんだ言っても自分の中で一番しっくりきてるのかも知れません。

使っていなかった間に作業環境が変わり、.bash_profileのalias設定を追加し忘れてた為、文字コードによるコンパイルエラーや実行時の文字化けが起こるようになっていた。今回はこれを解消する方法。
次期メジャーバージョンのリリースがもうすぐという時期のネタでは無いけどね...

下のような設定で揃える

ソースコード:ASCII(日本語含まず), UTF-8(日本語含む)
コンパイル :UTF-8
■実行    :UTF-8
■環境    :Mac ターミナル 文字エンコーディング UTF-8

テスト用のプログラム書く
文字出力の確認だけなので、test1は『test』,test2は『テスト』と出力させるだけのコード
MacBookAir:JavaCode ****$ cat test1.java
class test1 {
public static void main(String[] args) {

System.out.println("test");

}
}

MacBookAir:JavaCode ****$ cat test2.java
class test2 {
public static void main(String[] args) {

System.out.println("テスト");

}
}

fileコマンドで2ファイルの文字コードを確認しておく
MacBookAir:JavaCode ****$ file *
test1.java: ASCII
test2.java: UTF-8 Unicode


オプション無しでコンパイル、実行してみる
MacBookAir:JavaCode ****$ javac test1.java
MacBookAir:JavaCode ****$ javac test2.java
test2.java:4: ?x??:???̕????́A?G???R?[?f?B???O SJIS ?Ƀ}?b?v?ł??܂???B
System.out.println("??????);
^
test2.java:4: ?x??:???̕????́A?G???R?[?f?B???O SJIS ?Ƀ}?b?v?ł??܂???B
System.out.println("??????);
^
test2.java:4: ?????񃊃e???????????Ă??܂???B
System.out.println("??????);
^
test2.java:4: ';' ??????܂???B
System.out.println("??????);
^
test2.java:7: ?\????͒??Ƀt?@?C???̏I???Ɉڂ?܂???
}
^
?G???[ 3 ??
?x?? 2 ??
test1は『ASCII』で保存されてるのでオプション無しでもコンパイルは通る。test2は『UTF-8』で保存されてるのでエラーを吐いている。ちなみにエラー出力も文字化けしてます。Javaコンパイラは標準で文字コードSJIS』が呼ばれるものだと思ってるので当然。回避する為にはオプションを付けて、ファイルの文字コードが『UTF-8』であることを教えてあげる必要がある。
MacBookAir:JavaCode ****$ javac -J-Dfile.encoding=utf-8 test2.java

クラスファイルが生成されたので実行してみる

MacBookAir:JavaCode ****$ java test1
test
MacBookAir:JavaCode ****$ java test2
?e?X?g

ここで悩んでしまう方が多い。なぜ文字化けが起きているのか。オプションを付けて『UTF-8』でコンパイルしたし、ターミナルの文字エンコーディングも『UTF-8』に設定しているのにと。

Java SE 6は内部文字コードSJISが使われている。オプションを付けて『UTF-8』でコンパイルしたところで、それはコンパイラに「このファイルの文字コードは『UTF-8』だよ」と伝えてるだけで、実行時まで『UTF-8』で実行されてる訳ではない。

UTF-8で実行,表示するには下のようにオプションを付けてあげる必要がある

MacBookAir:JavaCode ****$ java -Dfile.encoding=utf-8 test2
テスト


忘れないうちにbash_profileのalias設定をしておく
ターミナルの文字エンコーディングを『SJIS』に変更すれば解決することだったが、毎回設定するのは面倒なので今回はオプションで回避ということになった。JavaのプログラムをWindowsで実行することはあっても、書くことは無いのでこれで良い。

毎回オプションを付けて実行するのが面倒なので、.bash_profileのalias設定をしておく。

MacBookAir:~ ****$ pwd
/Users/****
MacBookAir:~ ****$ cat .bash_profile
alias javac='javac -J-Dfile.encoding=utf-8'
alias java='java -Dfile.encoding=utf-8'