$KCODE is no longer effective

M17N対応の施されたRuby1.9系は、$KCODEは使わない。ということらしい。

irb(main):001:0> $KCODE
(irb):1: warning: variable $KCODE is no longer effective
=> nil

では、スクリプトのエンコーディングを指定するには代わりに何を使えば良いのだろう。

Ruby1.9はM17N対応にJavaや.NET等が使用しているUCS(Universal Character Set)Normalization方式※ではなく、CSI(Code Set Independent)方式を採用しているため、メモリを覗いてエンコーディングを決め打ちすることができないため、なんらかの方法で明示的にスクリプトのエンコーディングを与える必要がある。

1. マジックコメント
2. コマンドラインオプション
3. Encoding.default_internal

と幾つか方法はあるようだが、$KCODEと同じ感覚で使えるのはマジックコメントで指定する方法だろうか。

#coding: euc-jp

#coding: shift_jis

#coding: utf-8

等とそれぞれの名称でコメントとして記述すると、以降の文字列はその指定したエンコーディング名で記述されていることとして処理される。

うーん、これがベストなのだろうか。

今日参考にさせて頂いたURL:
Rubyist Magazine - Ruby M17N の設計と実装

Java(1.5以降)や.NETでは内部形式としてUTF-16を使用している