OS XにおけるJavaアプリケーションのエンコーディング

前記事の続きです。

結論から言うと、IntelliJ IDEA(やEclipse)にも環境変数LANGを渡すことができれば、Java 7における開発で日本語の扱いに問題が出なくなります。_JAVA_OPTIONSJAVA_TOOL_OPTIONSは不要です。

file.encodingだけでは足りない

ここではIntelliJ IDEAを取り上げますが、おそらくEclipseも同様です。

Java 6まではシステムプロパティfile.encodingUTF-8に設定していればとりあえず大丈夫でした。

ところがJava 7ではfile.encodingを設定していてもうまくいきません。

file.encodingUTF-8を設定した状態で日本語テストメソッドを実行しても、正しく認識されずエラーとなります。(余談ですがIDEAは12.1から-Dfile.encoding=UTF-8info.plistにデフォルトで記述されるようになりました)

LANGが無い場合

原因はsun.jnu.encoding

これはJava 7からシステムプロパティsun.jnu.encodingの影響も受けるようになったためです。

sun.jnu.encoding自体はJava 6にも存在していたようですが、少なくとも私が使っている範囲では何か影響を与えることはありませんでした。あと、ざっとググった範囲ではこのプロパティについての定義がされているドキュメントは見つけられず何者なのかわかっていません。こんなバグ登録はあったけど。

また、sun.jnu.encodingはシェルから起動したJavaでは影響は無く、IDEA上から実行されるJavaに影響を与えます。

どうすればよいか

幸いsun.jnu.encodingfile.encodingと同様に環境変数LANGによって値が判別され、ja_JP.UTF-8であればUTF-8が設定されます。

LANGを渡せばうまくいくか試すため、Run/Debug Configurationsを開いてEnvironment variablesLANGを設定します。

LANGを設定

この状態で日本語テストメソッドを再度実行すると正常に実行されます。

LANGがある場合

OS Xアプリケーションへの環境変数の設定

OS Xアプリケーションに環境変数を渡すには、launchctlコマンドのsetenvオプションで設定します。アプリケーションの再起動後から設定が反映されます。

$ launchctl setenv LANG ja_JP.UTF-8

このままではOSを再起動すると設定が消えてしまうのでファイルへ設定を保存しておきます。Lion以前は~/.MacOSX/environment.plistでOS Xアプリケーションに渡す環境変数を設定できました。

しかし、Mountain Lionからは/etc/launchd.confしか効きません。~/.launchd.confも書いてあるサイトもありましたがこちらは効きません。launchd.conf(5)manにも現在サポートされていないことが明記されています。

設定の書式はlaunchctlコマンドに渡したパラメーターと同じです。/etc配下なのでsudovim等を起動してファイルを書き込んでください。

setenv LANG ja_JP.UTF-8

ちなみにシェルについてはこの設定を行わなくてもLANGが設定されます。システム環境設定言語とテキストの設定をTerminalやiTermが拾ってきて、内容に応じてLANGを設定してくれるようです。そのため、Englishに設定しているとen_US.UTF-8になるので、シェルの方でLANGの設定を書くようにしています。