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を使って解決する方法があったので纏める。
環境は
いままでの自分の対処法
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) の使い方
この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