From: Yukihiro Matsumoto Date: 2008-03-18T12:08:59+09:00 Subject: [ruby-dev:34079] Re: 異なるエンコーディングだと同じバイト列でも==にならない件 まつもと ゆきひろです 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#== は厳密すぎると思います。 おっしゃることは理解できないでもないですが、エンコーディング は空気のような(普段は無視してもかまわない)ような要素ではない と思いますし、同じように振る舞わない文字列(たとえば長さが違 う)がバイト列だけの比較で == が成立するのは整数と浮動小数点数 の関係を考えても、ちょっと勇気が必要です。 まつもと ゆきひろ /:|)