[Java] デフォルトロケール

Java では動作環境によってデフォルトのロケールエンコーディングが異なる。この違いによって、

  • ResourceBundle を利用したときのメッセージの言語
  • Reader/Writer を使うときのエンコーディング

が違ってくる。

ロケールは Locale.setDefault() メソッドでデフォルトを変更することができるが、JVM 起動時のシステムプロパティの設定によっても変更ができるようである。アプリケーション自体に変更を加えられないがデフォルトエンコーディングを変更したいときにはこの方法を使う。具体的には JVMコマンドラインオプションを以下のように設定する。

-Duser.language=en -Duser.region=US

こうすることで JVM 上でのデフォルトロケールが en_US になる。

同様に文字のエンコーディングを変えたいときには以下のように設定する。

-Dfile.encoding=UTF-8

ただ、ファイルのエンコーディングに関してはデフォルトエンコーディングに依存するコードはあまり書くべきじゃないかなと思う。これまで何回も動作環境を変えたときに文字化けが発生する問題に出くわした(自分が仕込んだんだが・・・)。

たとえばファイルを読み込むのに InputStreamReader を使うなら、

new InputStreamReader(in);

ではなく、

new InputStreamReader(in, "UTF-8");

のようにエンコーディングを明示的に指定する。これなら挙動が動作環境に依存しない。