The Ruby VM: Episode IV

The Ruby VM: Episode I, The Ruby VM: Episode II, The Ruby VM: Episode III の続きです。間が空いてしまったなぁ...

スレッドについて話してきましたので、次は文字エンコーディングについて少し話したいと思います。これは Ruby の将来に対するもう一つの大きな変更です。まつもと さん、あなたは Ruby に m17n(多言語化)を追加する計画について述べていますね。Ruby ユーザにとってこの変更はどんな意味があるのかを少し話していただけませんか?

まつもと さん(以下 Matz):

例えば "abc"[0]97 ではなく "a" になること、そして文字列のインデックスがバイトではなく文字を基準とすること、などの文字列操作の幾つかの非互換性を除けば、それほど大きな変更ではありません。私が思う最大の違いは、我々が Unicode をサポートすることを正式に宣言できることでしょう ;-)。

PerlPython と異なり、Ruby の M17N は Unicode ベース(ユニバーサル文字セット、USC)ではなく、文字セット非依存(CSI)です。Unicode は勿論、ISO8859 や EUC-JP といった他のエンコーディングスキームを Unicode 変換することなく処理することができます。

私たちのモチベーションを誤解する方もいるようですが、我々は Unicode を嫌悪しているわけではありません。私は状況さえ許せば Unicode を好んで使用するくらいです。我々が嫌いなのは文字セット間の変換です。歴史的な理由から、文字セットには数多くの変種があります。例えば Shift_JIS 文字セットには少なくとも 5種類の変種があり、それぞれ幾つかの文字マッピングに差異があります。不幸なことに我々にはそれらを区別する方法がないため、(文字セットの)変換は情報ロスの原因になるかもしれません。ある言語が Unicode 中心のテキスト操作を提供している場合、我々がその言語を使っている限りこの問題を回避する方法はありません。

ささだ さん(以下 ko1):
私の信条に基づき、このトピックは遠慮します :)。


エンコーディングを意識した String ということは、我々が作る全ての String に対してエンコーディングを指定することになるのでは、と少し心配です。実際にはどのように働くのか、少し説明していただけますか? デフォルトのエンコーディングは? プログラム全体に対するエンコーディングは設定できますか?

Matz:

スクリプトの先頭で、コーディングプラグマによって Ruby スクリプトのためのエンコーディングを指定することができます。例えばスクリプトUTF-8 なら、次の指定を試してください

    # coding: utf-8

これによりスクリプト中の全ての文字列と正規表現UTF-8 として扱われます。また open を介して IO で読み込まれる文字列のエンコーディングも指定することができます。

    open(path, "r:utf-8") do |f|
      line = f.gets
    end

または Perl のように binmode を用います。

    f = open(path, "r")
    f.binmode(":utf-8")

デフォルトエンコーディングは通常の IO ではバイナリで、ロカールは STDIN のために指定されたエンコーディングです。IO 読み込みの際のエンコーディング変換が許されるべきですが、API は未だ決定されていません。恐らく以下の表記で EUC-JP データを読み込み、それを UTF-8 に変換した文字列を返すことになるでしょう。

    open(path, "r:utf-8<euc-jp")


m17n のコードに関する進捗と、未だ残っている作業について教えていただけますか? この変更は 1.9.1 リリースに入るでしょうか?

Matz:

何か問題が起きたりしなければ、次のクリスマスにリリースする 1.9.1 で M17N を見られるでしょう。文字の扱いに関してはほとんど終わっていますが、コード変換(String#encode メソッドや IO 用のコード変換)に関しては未だ作業が残っています。

The Ruby VM: Episode IV

すいません、段々分からなくなってきたので訳が怪しさ満点になってます m(__)m。ちなみに The Ruby VM: Episode V も既に出ています。