前回 JDK6 をデフォルトで使うように設定してみました。JDK5 から JDK6 に変更したことで1つ注意しないといけない問題がありますね。そうです、エンコーディングの問題です。今回はエンコーディングについて NetBeans でも関係あるところを書いてみたいと思います。ただし、これは NetBeans で編集するソースファイルのエンコーディングの話しではありませんよ。NetBeans ではソースエンコーディングはプロジェクトごとに設定できます。デフォルトは UTF-8 です。プロジェクトのプロパティーダイアログで変更できます。

JDK5 と JDK6 ではデフォルトのエンコーディングが違う

Java で使うエンコーディングが JDK5 と JDK6 では違うのですね。JDK5 では UTF-8、JDK6 では SJIS になります。ファイルの入出力にエンコーディングを特に指定していない時にそのエンコーディングが使われます。実は私はしばらく気がつかなかったのですが ^^;) これはよく知られたことのようで、いろいろなブログに書いてありますね。ただ正式なドキュメントってどこにあるのでしょう。私が探した限りでは見つかりませんでした。

では試しに、こんなプログラムを実行してみましょう。
public class Main {
    public static void main(String[] args) {
        System.out.println("Japanese=日本語");
        System.out.println("file.encoding=" + 
                System.getProperty("file.encoding"));
    }
}
Mac OS X 10.5 の場合は何も考えないとロケールは ja_JP.UTF-8 が使われます。しかし JDK6 を使うとその出力は SJIS になってしまいますから、ターミナルで見ると以下のように日本語の出力は化けてしまいます。

この問題の対処策についてもいろいろなところに書かれていますので検索してみてください。ターミナルを SJIS にするのも1つの方法です。また上のように Java に -Dfile.encoding=UTF-8 を付けてエンコーディングを UTF-8 にするのも1つの解決策なのですが、正式にサポートされている使い方なのかどうかはわかりません。また、どこか1カ所変更してすべてを UTF-8 にするという方法はないでしょうかね、私が調べたかぎりではこれも見つかりませんでした。

JDK6 で統一して、エンコーディングも UTF-8 で使いたいのですが...

Mac OS X 10.5 ではユーザーの使うロケールはデフォルトでは UTF-8 ですよね。ですので、おそらくほとんどの方が最新の JDK6 を使って、エンコーディングは UTF-8 で使いたいと考えてるのではないでしょうか。一つのプログラムなら上に書いたように -Dfile.encoding=UTF-8 をつけて実行してあげればいいことになります。NetBeans ならば -J を頭につけて -J-Dfile.encoding=UTF-8 を引数に渡すか、<NetBeans>/etc/netbeans.conf に書きます。
# Options used by NetBeans launcher by default, can be overridden by explicit
# command line switches:
netbeans_default_options="-J-Dfile.encoding=UTF-8 -J-client -J-Xss2m -J-Xms32m...."
この回避策は Windows で外部アプリケーションが UTF-8 エンコーディングを使うときに文字化けを回避する方法と同じですね。
NetBeans で確認すると以下のように UTF-8 と表示されていますね。


ところがところが、困ったことにこのオプションは NetBeans から呼び出される java アプリケーションには引き継がれません。例えば GlassFish、Tomcat、JavaFX や javadoc コマンドなど、同じ JDK6 を使うようにできてもエンコーディングまでは変えられません。これができないと結局文字化けの原因になってしまいますね。呼び出されるアプリケーションがはっきりとわかっていればそこで設定してもよいですが、これも大変です。どこか1カ所で変更できるところがあればよいのですが... 一つの設定をすべての JavaVM に渡す方法で私が思いつくのは、ん〜 _JAVA_OPTIONS 環境変数を使うことでしょうか。JAVA_HOME と同様に ~/.MacOSX/environment.plist に書いてみます。
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>
        <key>JAVA_HOME</key>
        <string>/System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home</string>
        <key>_JAVA_OPTIONS</key>
        <string>-Dfile.encoding=UTF-8</string>
    </dict>
</plist>
この設定はもちろん Mac OS X 的にも、Java 的にも正式なものではありません。私が試してみたというだけのものです。使用は自己責任でお願いしますね。

こうしてみると1カ所で簡単に設定するちゃんとした方法がないのであれば、エンコーディングは SJIS のまま使ったほうがいいのかもしれませんね。ターミナルの件と、NetBeans で PHP や Ruby などの外部のインタプリタで UTF-8 を使う必要がある場合以外は、ほとんどの場合は問題ないのではないでしょうか。何か問題が起きた時に、そいえば SJIS で動いているんだったな、とすぐに気付けばいいのかもしれません。

関連するエントリ:
Comments:

Post a Comment:
Comments are closed for this entry.

This blog copyright 2009 by katakai