すがブロ

sugamasaoのhatenablogだよ

WindowsでEncoding.default_externalをUTF-8にするには

Ruby製のツールを扱う際にデフォルトエンコーディングがUTF-8じゃなくて人生厳しい場合がある

やりたかったこと

自分が使ったわけじゃないんですけど、compassを使うときにSASSファイル等はUTF-8なんだけどWindows環境でcompassを使ってビルドしようとするとデフォルトエンコーディングの違いからWindows-31Jじゃないプギャーと言わるらしい。

一般的なやり方と回避方法

当然ググったりしてみるんですけど、そうするとターミナル上でset LANG=ja_JP.UTF-8したり環境変数にLANGを登録しておけば良いと書いてある。 だがしかし、どうもRuby1.9系ではそれで対応できるらしいけど、Ruby2.0系では対応できないようだ。

追記

コメント欄で教えてもらいましたが、set RUBYOPT=-EUTF-8でエンコーディングを指定すれば良いのでした*1。そっちのほうが良い気がしますので続きは読まなくて良いです!! 参考:http://doc.ruby-lang.org/ja/2.0.0/doc/spec=2frubycmd.html#cmd_option

検証

  • Winodws 7
  • Ruby 1.9.3p374
  • Ruby 2.0.0p247

set LANGでの検証

これでダメだったから質問が僕の所に来たわけですが、念のため確認してみましょう。

Ruby 1.9.3

f:id:seiunsky:20130824222312p:plain

UTF-8になる。

Ruby2.0.0

f:id:seiunsky:20130824222325p:plain

UTF-8にならない。

chcpでの検証

そもそもターミナル上のエンコーディングを変更するならchcpを使う必要があるのでは?と思い立つ。以前ちょっとchcpを使った事があったので思い出した

chcp 65001としてUTF-8にしてどうなるのかを確認した。chcpを実行するとターミナルの表示がリセットされるので上記と違う形になっているけど、新しくターミナルを立ち上げなおしているので、実行前はWindows-31Jと表記されていることを確認している。

Ruby 1.9.3

f:id:seiunsky:20130824222329p:plain

UTF-8になった。

Ruby 2.0.0

f:id:seiunsky:20130824222333p:plain

UTF-8になった。

結論

chcpで文字コードを変えるとフォントの問題などで日本語を出力できない気がするので、画面に何かを表示するような類の問題だったらこれでは解決できないかもしれない*2。逆に、そういう事でも差し支えなければchcp 65001しておくのが良いと思う。 こういうのWindowsマスター的には当然のことなんでしょうか。あまり情報が無いように感じました。今回はたまたまchcpの存在をしっていたからなんとかなったけど、知らなかったらお手上げだった気がします……。

どうしても書かなくてはならない宣伝

書籍を出版しましたのでぜひともご購入頂ければと思います!! ありがたい話で売れ行きは好調のようです。もしかしたら書店で買えない*3かもしれないので、ここでポチッとしておくと良いかもしれません。

パーフェクトRuby (PERFECT SERIES 6)

パーフェクトRuby (PERFECT SERIES 6)

*1:RUBYOPTの存在を完全に忘れていた

*2:レジストリいじれば云々ってのは見るけど、そこまでは試してない

*3:タイミングによっては品切れになってる可能性が微レ存