Ruby 1.9系のエンコード指定

モデルに定数を追加しようとしたら、エラーが発生。マルチバイト文字が原因っぽい。1.8系のときは $KCODE='u' とかしてたけど、変わったっぽい。そーいや 1.8系のころのエラーメッセージと違ってるし。^^;)

SyntaxError: APP_ROOT/app/models/client.rb:2: invalid multibyte char (US-ASCII)
GENDER = {1=>'男性', 2=>'女性'}


ググったら Ruby Magazine に詳しい解説があって、やっぱり変わってたよ。1.9 系は4択らしいけど、覚えやすいのは4番目だね。 :-)

#coding:utf-8

Ruby M17N の設計と実装 - Magic Comment

ちなみにエンコード指定のことは Magic Comment が正しい呼び方らしい。 そんで Magic Comment なしの場合、US-ASCII とみなされるとのこと。理由は「ソースコードの可搬性を確保するため」だそうな。忘れちゃいけないことなので引用させてもらおっと。:-)

magic comment は XML でいう XML 宣言の encoding 属性のようなもので、これを記述することで script encoding を指定できます。magic comment を書かなかった場合、script encoding は US-ASCII とみなされます。
(中略)
なお、非 ASCII な文字を含むリテラルを magic comment なしに書いていた場合、US-ASCII ではない文字が存在しているとして、invalid multibyte char というエラーになります。これはソースコードの可搬性を確保するための処置です。スクリプトの作者は自分の書いたスクリプトがどのエンコーディングで記述されているかを知っています。しかし、そのスクリプトを入手した第三者が後からエンコーディングを知ることは簡単ではありません。日本語ならば NKF.guess 等でエンコーディングを推測することも不可能ではありませんが、ヨーロッパ系のエンコーディングの場合は、後から推測することが不可能な場合もあります。このため、Ruby 1.9 では ASCII 外の文字をソースコード中に記述する場合は、magic comment が必須、という方針になっています。

Ruby M17N の設計と実装 - Magic Comment