Windows版のRubyはANSIエスケープシーケンスをいい感じに処理してくれる?

夏コミ終わりましたね。 参加された方々はお疲れ様でした。

さて、最近ちょっと気付いたのですが、 Windows版のRubyANSIエスケープシーケンスをいい感じに処理してくれるっぽいのです。 ほとんどのRubyistの方々には常識なのかも知れませんが、 ちょっと感動したので記事として書かせていただきます。

ANSIエスケープシーケンスとは

以下のリンクの方を参照していただければ、よく分かると思います。 要は、コンソールで文字色を付けたりカーソルを動かしたりするための 特殊な文字列のことです。 こういった規格があるおかげで、Vimのカラースキームとかが可能になるわけですね。

Windows環境とANSIエスケープシーケンス

Windowsは標準ではANSIエスケープシーケンスに対応していないらしく、 以下のANSICONをインストールするとか、Cygwin(Mintty)やbash(Git/MSYS)を使うとか、 以前のエントリで書いたように ConEmuをはじめとするコンソールエミュレータを使うこととかでようやく色付きの文字が出せるようになります。

github.com

対応していない場合は意味不明な文字列、つまりANSIエスケープシーケンスそのものが表示されることになります。

Rubyだと何だというのか、

ANSIエスケープシーケンスをつけて、色付きの文字列を出力してみたいと思います。 PerlPythonRubyの3つの言語で、ごくごく単純なコードを作ってみました。

print("\033[38;5;64m hoge \033[0m\n");
print "\033[38;5;64m hoge \033[0m"
puts "\033[38;5;64m hoge \033[0m"

さて、これら3つのスクリプトを、ANSIエスケープシーケンスに対応している ConEmu上で実行してみると、以下のように緑色の文字列を出力することができます*1

f:id:e8l:20150816231236p:plain

では、今度はANSIエスケープシーケンスに対応していない生のコマンドプロンプトで 同じスクリプトを実行してみると、以下のようになります。

f:id:e8l:20150816231248p:plain

はい。 見て分かりますね。 RubyだけANSIエスケープシーケンスが表示されてないんです。

どういうふうに処理しているのか分からないのですが、 Rubyだけ、内部で特別に処理を行って、対応していない場合は出力しないようにしてくれるようです。 Rubyすごい。

補足

環境(バイナリ)依存かもしれないので、一応使っているRubyについて補足しておきます。 僕の環境ではRubyInstaller版のRuby 2.2.2(x64)を使用しています。

*1:拡張文字色を使っているので、Linuxなどでも256色対応のターミナルじゃないと表示できないことがあります。