まつもと ゆきひろです

In message "Re: [ruby-dev:34077] 異なるエンコーディングだと同じバイト列でも==にならない件"
    on Tue, 18 Mar 2008 11:41:10 +0900, rubikitch / ruby-lang.org writes:

|Ruby 1.9では同じバイト列であっても異なるエンコーディングの場合は == にはなりません。
|方向性としては正しいかもしれませんが、ハマるケースが多いのではないでしょうか?

違うエンコーディングであってもコンパチブル(他の処理で同一視
される)場合には==は等しいと見なすようになっています。コンパ
チブルとは

  * 同じエンコーディング、または
  * 両方が7bit文字しか含まない(かつasciicompat)

ということです。

|たとえばネットワークから読み込んだときサーバーが実際と異なるcharsetを吐き出した場合とか。
|身近な例では何気なく下のようなコードを書いた場合です。
|String#inspectがencoding情報を表示しない以上、
|「同じ文字列なのになんで==にならないの!?おかしい!」と思う人が多いと思います。
|僕としては、エンコーディングは空気のような存在であるべきだと思っています。
|いちいちforce_encodingをつけるのも気持ち悪いですし。
|
|異なるエンコーディングの文字列を結合できないのは当然だと思いますが、
|せめて == での比較は許してもいいのではないでしょうか?
|Rubyの == はFixnumとFloatの比較を許すなど空気を読んでくれる演算子だと思っていますが、
|現状の String#== は厳密すぎると思います。

おっしゃることは理解できないでもないですが、エンコーディング
は空気のような(普段は無視してもかまわない)ような要素ではない
と思いますし、同じように振る舞わない文字列(たとえば長さが違
う)がバイト列だけの比較で == が成立するのは整数と浮動小数点数
の関係を考えても、ちょっと勇気が必要です。

                                まつもと ゆきひろ /:|)