Ruby 1.9 で日本語(マルチバイト)の文字列を扱う場合の注意書き
新しく Ruby をインストールする機会があったので、Ruby 1.9 をインストールしてみた。
実際に使い始めると、マルチバイトの取り扱いに戸惑ったため、以下を備忘録として残しておく。
スクリプトファイルの文字コードについて
- Ruby 1.8 までの -K オプションは非推奨
- グローバル変数 $KCODE は廃止
Ruby 1.8 と Ruby 1.9 での大きな変更点
Ruby 1.9 における多言語化仕様 Ruby M17N では、多くの言語・システムで採用されている Unicode 正規化方式でなく、CSI 方式を採用したり、独自のエンコーディング変換エンジンである transcode を搭載した
http://jp.rubyist.net/magazine/?0025-Ruby19_m17n#l0
M17Nとは
M17N は Multilingualization の略で、多言語化を意味しています。M17N は
- 複数の言語などで利用できるようにするためにローカライズすることを指すこと
http://www.jpnic.net/ja/research/200605-dom/chapter1-2.pdf- 同時に複数の言語を扱えるようにすること
http://www.m17n.org/m17n-lib-ja/と言った意味がありますが、Ruby M17N では後者の意味で用いています。
http://jp.rubyist.net/magazine/?0025-Ruby19_m17n#l5
UCS Normalization と CSI
Code Set Independent 方式の場合には(PerlやJavaが採用している) UCS 正規化方式のように、唯一絶対の内部コードというようなものは存在しません。
http://jp.rubyist.net/magazine/?0025-Ruby19_m17n#l13
()内は筆者追加。
そして、
なお、非 ASCII な文字を含むリテラルを magic comment なしに書いていた場合、US-ASCII ではない文字が存在しているとして、invalid multibyte char というエラーになります。
http://jp.rubyist.net/magazine/?0025-Ruby19_m17n#l18
これはソースコードの可搬性を確保するための処置です。スクリプトの作者は自分の書いたスクリプトがどのエンコーディングで記述されているかを知っています。しかし、そのスクリプトを入手した第三者が後からエンコーディングを知ることは簡単ではありません。日本語ならば NKF.guess 等でエンコーディングを推測することも不可能ではありませんが、ヨーロッパ系のエンコーディングの場合は、後から推測することが不可能な場合もあります。このため、Ruby 1.9 では ASCII 外の文字をソースコード中に記述する場合は、magic comment が必須、という方針になっています。
以上のような理由から、magic comment の効果は書かれたスクリプトのみに限定され、例えば script encoding を指定して require するといった機能は提供されていません。