Closure Compilerのエラー出力がなぜかSJISな謎
(追記: これはMac版のJava6のデフォルトエンコーディングがSJISになっていることが原因らしい。Closure Compilerの問題ではない。)
自分のターミナルの文字コードも、ソースコードの文字コードもUTF-8なのに、それをコンパイルした際のエラー出力がなぜかSJISになってしまって困っている。何が原因だろう?
まずは前提を確認。ターミナルもソースコードもUTF-8である。ちなみにOSはMac(Lion)だ。
tmp$ echo $LANG ja_JP.UTF-8 tmp$ cat tmp.js var x = "こんにちは"; y; tmp$ nkf -g tmp.js UTF-8
こいつをコンパイルすると標準エラー出力が化けてる。どうしてかと文字コードを確認してみたらなんとSJISという謎。(記事が化けてもややこしいので変な文字はxに置き換えておいた。)
tmp$ java -jar ../common/compiler.jar tmp.js > stdout.txt 2> stderr.txt tmp$ cat stderr.txt tmp.js:1: WARNING - Suspicious code. This code lacks side-effects. Is there a bug? var x = "????x???"; y; ^ 0 error(s), 1 warning(s) tmp$ nkf -g stderr.txt Shift_JIS
charsetを指定したら直るのかなと思ったが、エラー出力の文字コードはSJISのままだった。代わりに標準出力に出てきたコンパイル済みコードがUTF-8になった。
tmp$ java -jar ../common/compiler.jar --charset=utf8 tmp.js > stdout2.txt 2> stderr2.txt tmp$ nkf -g stderr2.txt Shift_JIS tmp$ nkf -g stdout.txt ASCII tmp$ nkf -g stdout2.txt UTF-8
追記
とりあえず対処療法としてはこれでよさそうな感じ。
$ java -Dfile.encoding=utf8 -jar ../common/compiler.jar tmp.js > stdout2.txt tmp.js:1: WARNING - Suspicious code. This code lacks side-effects. Is there a bug? var x = "こんにちは"; y; ^ 0 error(s), 1 warning(s)
jarが作られた環境が例えばWindowsなんかのターミナルがSJISなところで、コンパイル時にSJISを標準エラー出力のデフォルトエンコーディングとして埋め込んじゃってるとかってことなのかなぁ。