Ruby 1.9 で日本語(マルチバイト)の文字列を扱う場合の注意書き

新しく Ruby をインストールする機会があったので、Ruby 1.9 をインストールしてみた。
実際に使い始めると、マルチバイトの取り扱いに戸惑ったため、以下を備忘録として残しておく。

スクリプトファイルの文字コードについて

  1. Ruby 1.8 までの -K オプションは非推奨
  2. グローバル変数 $KCODE は廃止

Ruby 1.8Ruby 1.9 での大きな変更点

  1. YARV への移行
  2. 正規表現エンジン鬼車の採用
  3. Enumerator の組み込み
  4. 言語化仕様 Ruby M17N の導入

Ruby 1.9 における多言語化仕様 Ruby M17N では、多くの言語・システムで採用されている Unicode 正規化方式でなく、CSI 方式を採用したり、独自のエンコーディング変換エンジンである transcode を搭載した

http://jp.rubyist.net/magazine/?0025-Ruby19_m17n#l0

M17Nとは

M17N は Multilingualization の略で、多言語化を意味しています。M17N は

と言った意味がありますが、Ruby M17N では後者の意味で用いています。

http://jp.rubyist.net/magazine/?0025-Ruby19_m17n#l5

UCS Normalization と CSI

Code Set Independent 方式の場合には(PerlJavaが採用している) UCS 正規化方式のように、唯一絶対の内部コードというようなものは存在しません。
()内は筆者追加。

http://jp.rubyist.net/magazine/?0025-Ruby19_m17n#l13

そして、

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

http://jp.rubyist.net/magazine/?0025-Ruby19_m17n#l18

Magic Comment でスクリプトファイルの文字コードを明示する

Magic Comment

#!/bin/env ruby
# 下記の行で、このファイルが書かれた文字コードを明示させている
# -*- coding: utf-8 -*-