永井@知能.九工大です.

From: Yukihiro Matsumoto <matz / ruby-lang.org>
Subject: [ruby-dev:33248] Re: Binary String
Date: Mon, 21 Jan 2008 18:11:42 +0900
Message-ID: <E1JGpaE-00082W-G1 / x61.netlab.jp>
> 「こういうプログラムがあって、こんな面倒なことをしないと文字
> 化けする」とか、「Tcl ではこんなにストレートに書けるのに
> (Rubyのせいで)Ruby/Tkではこんなに回りくどい」とか言ってくださ
> ると助かります。

ちょっと誤解されているような気がするので,念のためですが,
Ruby/Tk 自体については

From: Hidetoshi NAGAI <nagai / ai.kyutech.ac.jp>
Subject: [ruby-dev:33127] Re: Binary String
Date: Wed, 16 Jan 2008 10:21:14 +0900
Message-ID: <20080116.102114.71109541.nagai / ai.kyutech.ac.jp>
> 議論 (になっていないのかもしれませんが) が完結していないのは
> 承知していますが,Ruby 1.8 との互換性維持のためというのが
> 一切受け入れられない (全滅もやむをえない) ということであれば,
> これ以上はお願いしてもどうしようもないと思えるためです.
> 
> つまり,
> 
>  * binary に対しては ASCII-8BIT を与える.
> 
>  * ASCII-8BIT が来たときには binary であるとし,一切変換を行わない.
> 
> という対応で,互換性を捨てる (従来のスクリプトは極めて高い確率で
> 文字化けする) ということになります.

というように,自らの主義には反しつつも互換性を捨て去ることに
妥協はしています.
ただ,その後の [ruby-dev:33161], [ruby-dev:33162] とかで
気になる話も出ているので,そのまま妥協しても本当に大丈夫なのかが
ちょっと心配になってはいますが.(^_^)

# 現状が変化したり,本当にどうしようもない例が見つかれば
# 撤回せざるをえないということになるかもしれません.

にもかかわらず UNDEFINED-8BIT なんて話を出したりしているのは,
さまざまな外部ライブラリをブラックボックスとして用いる場合を
考えてのことです.
つまり,外部ライブラリのメソッドの戻値の encoding を
どこまで信じたらいいかという話でもあります.

ASCII-8BIT で返ってきたとして,
これは必然で ASCII-8BIT になっているのか,
それとも未定義のためやむをえず ASCII-8BIT になっているのか...
Ruby 1.9 用の外部ライブラリならいいのですが,
本来は Ruby 1.8 用である外部ライブラリを援用しているケースでは
少々やっかいです.
事実 Marshal のケースでは,何とか対策するために
ライブラリに手を入れざるを得なかったわけですよね?

もちろんここで Ruby/Tk の場合と同様に
「Ruby 1.8 用のライブラリを使う方が悪い」とか,
「Ruby 1.8 用のライブラリで文字列を扱うものはほとんど諦めてください」
とすることもできます.
それも確かに一つの選択肢でしょう.
開発が継続しているライブラリであれば,いつかは保証できませんが,
多分,Ruby 1.9 対応は行われるだろうと期待することは可能です.
あるいは,自分でそのライブラリの解析ができる人なら
自分でパッチを作成して利用可能にすることができるかもしれません.

ですが,そうでない人の場合はどうでしょう?
開発が停止してブラックボックスとなっているライブラリが
どうしても必要な人や,1.9 対応をどうしても待てない人は?
すべてのケースで「諦めて 1.8 を使い続けてね」と答えるのを
是とするのかどうかです.

# 根本的に対応不可能なケースがあるのは承知していますから,
# そのような場合は含めていません.
# 「Ruby 1.9 自体がいろいろ変っているんだから」というのは
# 「Ruby 1.8 のものはすべて使えない」と同意ではないですよね.

UNDEFINED-8BIT はこうした場合の救済策になるのではないかと考えて
話に出したものです.
直接には手が届かないライブラリ内部の処理に
デフォルトの encoding の情報を与えることができます.
その結果,encoding が明記されていない文字列を
期待する encoding で適切に処理してもらえるように
できる可能性が高まります.
また,UNDEFINED-8BIT で返されたならば,
他の encoding の場合と違って Ruby 1.9 としての処理の結果の
必然として得られたものではないということが分かります.
それが分かれば好きなように料理することができます.

UNDEFINED-8BIT のようなものが存在しなければ,
ブラックボックスの戻値はすべて同じ encoding であると
推定するしかありません.

# 今回も「何だか良く分からないことを感情的に喋っている」と
# 思われて終わりかなぁ...(^_^;
-- 
                                       永井 秀利 (九工大 知能情報)
                                           nagai / ai.kyutech.ac.jp