From: take_tk Date: 2008-01-28T00:20:05+09:00 Subject: [ruby-dev:33425] Re: str[idx] = num。str.encoding == nil たけ(tk)です。 [ruby-dev:33413] Re: str[idx] = num。str.encoding == nil にて "NARUSE, Yui" さん 曰く: > > encodingによってバイナリ配列扱いをもうけるのなら、 > > str.encoding = nil のときにバイナリ配列扱いにするというのはどうでしょう > > か? > > str.encoding が ASCII-8BIT がバイナリ配列扱いのはずです。 だいたい納得しました。バイナリ配列として扱いたい場合には エンコードを ASCII-8BIT にしてから、 代入するときには str[idx]=num str[idx]=chr どちらでもよくて、 参照するときには str[idx] #=> chr は文字を返すので、numで欲しければ、String#ord を使って str[idx].ord #=> num としろ、ということですね。 temp = s.encoding s.force_encoding('ASCII-8BIT') s[2] = "a" s[3] = 101 p s[2] #=> "a" p s[3].ord #=> 101 s.force_encoding(temp) (1)提案したのは、encoding==nil というのを許して、その場合には、Fixnum での出し入れにする、という1.8コンパチバージョンを用意してはどうか、とい うことでした。encoding が「ない:nil」なら 1.8 とコンパチ、という発想です。 コンパチモードがあれば、s[3] で参照している部分を s[3].ord に変更する必 要がなくなる。 (2)ところで、この方法だと、ruby1.8 では s[3] はFixnum を返すので、エ ラーになってしまいます。s[3].ord でエラーにならないようにするためには、 Integer#ord を定義しておくのがよい、ということになるのでしょうか? http://www.machu.jp/diary/20080123.html#c04 * String#force_encoding などはダミーメソッドを用意する。 [ruby-dev:32206] Integer#ord for 1.8 で、すでに提案されていましたね。入るんでしょうか? (3)ところで、多バイト文字での String#ord は何を返すのでしょうか A.1バイト目の数値 B.多バイト文字のあとのバイトを単純に 256 倍して加算した数値。 C.何らかの統一的な文字コード * 予想としてはBかな? take_tk = kumagai hidetake