MacでJavaのencodingがSJISなのを起動時に対処


概要

JDK5まではUTF-8だったJavaのencoding、

JDK6からはSJISに。

https://blogs.oracle.com/katakai/entry/netbeans_and_java_for_mac2


死ね!! SJIS死ね!!!


いままで全く気にしてなかったんだが、原因調べてみたいんだけど、

Macからは特になんも指定してないような感じ。JDKのほうのデフォルトの変化か何かなのかな? 諭してくれ神々よ。

すくなくとも日本語でっせ! みたいな情報がJVM使う際にわたってると思うんだけど。

それかinstall時かな?



で、結局文字化けして困るよね!

っつーのを、launchctlを使って解決する方法があったので纏める。


環境は

スクリーンショット 2012-11-11 15.02.41.pngスクリーンショット 2012-11-11 15.03.33.png



いままでの自分の対処法

JDK6以降をそのまま使うと、例えば対処してないツールからJavaとか使ったときに、

マルチバイトな部分が全部文字化けする。

対処方法として、今まで下記を使ってきた。


・ツールの起動時に

export _JAVA_OPTIONS=-Dfile.encoding=UTF-8


とかやる


これがまあ、、、効かせやすいツールと効かせにくいツールが有るわけで。


大概Terminalから実行するCUIのツールだったら、Terminal自体の設定として

上記を実行して済ませてきた。bashの設定に書いたりとか。


ただコレだと、Terminalから起動すればその設定が受け継がれるだけであって、スマートな方法ではない。

(そも受け継がれないこともある)

JAVA_OPTIONS自体、JVMへとパラメータを渡す際のものなので、ひょいひょい渡しているのも気に喰わない。


ずーっと代案探してたんだけど、ステキな事を考える人は居るもので。



ステキな対処法

Setting environment variables in OS X?

http://stackoverflow.com/questions/135688/setting-environment-variables-in-os-x/588442#588442


launchctlが起動時に触るファイルを、

/etc/launchd.conf

として作ってしまい、その中に起動時の設定を書いてしまおう、というもの。


launchctlの日本語資料で一番いいのはコレ。

maruko2 Note

LaunchDaemons (launchctl, launchd.plist) の使い方

http://bit.ly/TlRXcn


このStackoverflowの記事中で弄っている項目自体はかなり物騒な感じなのだけれど、

自分がやりたいのはencodeをUTF-8にするだけなので、

setenv JAVA_TOOL_OPTIONS -Dfile.encoding=UTF-8

とだけ書き込んでマシン再起動。ログオフでもいいかもしれない。


で、たとえば

java -h

highvision:~ sassembla$ java -h

Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8

使用方法: java [-options] class [args...]

           (クラスを実行する場合)

   または  java [-options] -jar jarfile [args...]

           (jarファイルを実行する場合)

optionsには次のものがあります。

    -d32   使用可能な場合は32ビットのデータ・モデルを使用する

    -d64   使用可能な場合は64ビットのデータ・モデルを使用する

    -server   "server" VMを選択する場合

                  デフォルトVMはserverです,

                  これはサーバークラスのマシンで実行しているためです。



    -cp <class search path of directories and zip/jar files>

    -classpath <class search path of directories and zip/jar files>

                  クラス・ファイルを検索するディレクトリ、

                  JARアーカイブおよびZIPアーカイブの:で区切られたリストです。

    -D<name>=<value>

                  システム・プロパティを設定する

    -verbose[:class|gc|jni]

                  詳細な出力を行う

    -version      製品バージョンを出力して終了する

    -version:<value>

                  指定したバージョンを実行に必須にする

    -showversion  製品バージョンを出力して続行する

    -jre-restrict-search | -no-jre-restrict-search

                  ユーザーのプライベートJREをバージョン検索に含める/除外する

    -? -help      このヘルプ・メッセージを出力する

    -X            非標準オプションに関するヘルプを出力する

    -ea[:<packagename>...|:<classname>]

    -enableassertions[:<packagename>...|:<classname>]

                  指定した粒度でアサーションを有効にする

    -da[:<packagename>...|:<classname>]

    -disableassertions[:<packagename>...|:<classname>]

                  指定した粒度でアサーションを無効にする

    -esa | -enablesystemassertions

                  システム・アサーションを有効にする

    -dsa | -disablesystemassertions

                  システム・アサーションを無効にする

    -agentlib:<libname>[=<options>]

                  ネイティブ・エージェント・ライブラリ<libname>をロードする。例: -agentlib:hprof

                  -agentlib:jdwp=helpと-agentlib:hprof=helpも参照

    -agentpath:<pathname>[=<options>]

                  フルパス名でネイティブ・エージェント・ライブラリをロードする

    -javaagent:<jarpath>[=<options>]

                  Javaプログラミング言語エージェントをロードする。java.lang.instrumentを参照

    -splash:<imagepath>

                  指定したイメージでスプラッシュ画面を表示する

詳細はhttp://www.oracle.com/technetwork/java/javase/documentation/index.htmlを参照してください。

みたいな感じになった。

ステキ。



副作用

あんまり思いつかないけど、SJISで動かしてる人にこのテロすると、どこにかいてあるんだか迷わせることができて邪悪。

launchctl周りは情報少ない気がする。



おまけ

JVMのパラメータいろいろが見やすく紹介されてるサイト見つけた。

http://javarevisited.blogspot.jp/2011/11/hotspot-jvm-options-java-examples.html