From: "NARUSE, Yui" Date: 2008-09-19T21:53:10+09:00 Subject: [ruby-dev:36399] Re: [Ruby 1.9 - Bug #407] (Open) String#<< Yukihiro Matsumoto さんは書きました: > まつもと ゆきひろです > > このチケットに関連してると思うのですが、 > > |> % ruby19 -Ku -ve'p "ABC" << 256' > |> ruby 1.9.0 (2008-09-17 revision 19392) [x86_64-freebsd7.1] > |> -e:1:in `
': 256 out of char range (RangeError) > |> > |> UTF-8 だとこんな感じ。 > |> % ruby19 -Ku -ve's="ABC\u3042" << 256;puts s.dump' > |> ruby 1.9.0 (2008-09-17 revision 19392) [x86_64-freebsd7.1] > |> "ABC\xE3\x81\x82\xC4\x80" > | > |この1.9の振る舞いはうれしくないんじゃないかな。 > |"ASCII Compatible"の定義とかをよーく考えると、ASCIIの文字列とそうじゃな > |い文字列はこの場合同じ振る舞いになるべき(黙って大きい方のエンコーディン > |グに揃えるか、一律にエラー)と思いますよ。 > |# じゃないと激しく使いづらすぎてかなわん。 > > という指摘がありました。個人的には現状以外の振る舞いが適切だ > とは思わないのですが、「compatibleなはずなのに振る舞いが違う > のは変」という認知は理解できないでもないです。 > 「黙って大きい方のエンコーディングに揃える」、が現在の動きの意図でしょう。 % ruby19 -Ku -e' p "\u3042" << 0x3044 p "ABCDEF".force_encoding("UTF-8") << 0x3044 p "ABCDEF" << 0x3044' "あい" "ABCDEFい" -e:3:in `
': 256 out of char range (RangeError) しかし、並べてみると確かにこれはおかしな挙動で、 これの原因は思うに ASCII Compatible 云々でなく、 スクリプト内の 7bit clean な String の encoding を US-ASCII にしている点 のような気がします。