From: Hidetoshi NAGAI Date: 2008-01-20T00:10:55+09:00 Subject: [ruby-dev:33188] Re: Binary String 永井@知能.九工大です. From: Tanaka Akira Subject: [ruby-dev:33165] Re: Binary String Date: Fri, 18 Jan 2008 13:24:47 +0900 Message-ID: <877ii7vjzp.fsf@fsij.org> > 前田さんの [ruby-dev:33164] も興味深い例ですね。 > > Ruby 1.8 から Marshal 経由でやってきた String に推定を行いた > いかどうかといわれても、それだけの条件ではどっちともいいがた > い気がします。というか、両方のケースがあるでしょう。残念なこ > とにその String が作られる元になったところに encoding が明示 > されていたのかどうかは Ruby 1.9 側からは確認の術がありません。 > > tk としては String を生成する側、つまり Marshal でどちらか判 > 断して区別を付けてほしいのかもしれませんが、Marshal でやれと > いわれてもなぁ。 センター試験の試験監督をしながらつらつら考えていたのですが, # もちろん試験監督業務は怠りなくやってますよ.(^_^) Ruby 1.8 からの Marshal 経由 String のことまで考えると, UNDEFINED-8BIT (dummy encoding をこれに割り振るのも可?) と Encoding.default_undefined とを新設した上で, Ruby 1.9 では Marshal のフォーマットバージョンを 上げてしまうというのが一番すっきりしそうな気がします. 以下,考え違いをしていたらすみません. Ruby 1.8 での Marshal では何らかの encoding を想定しているか, encoding 情報を別に保存しているかの可能性が高いと思われます. この場合,推測で encoding を与えても推測せずに ASCII-8BIT としても, 多分,どちらも不便だろうと思います. で,Ruby 1.9 としては,String に encoding は必須であると考えると, Marshal でも encoding を保存しなければならないはずです. その意味では,Marshal のフォーマットバージョンは上げるべきと 言っていいのでしょうか? 問題は Ruby 1.9 で Ruby 1.8 の Marshal 経由 String を 読み込んだ場合ということですよね? * この場合,Marshal 経由 String の encoding は UNDEFINED_8BIT にする. * Encoding.default_undefined のデフォルト値は ASCII-8BIT とし, UNDEFINED_8BIT を設定することはできないものとする. * UNDEFINED_8BIT の String を処理する際には,その encoding を Encoding.default_undefined の値であるとして処理する. UNDEFINED_8BIT の String からの処理結果として生成される文字列の encoding は,その時点の Encoding.default_undefined の値とし, UNDEFINED_8BIT が設定されることはないものとする. * 参照されただけの String を,UNDEFINED_8BIT から 現在の default_undefined の値に変更すべきかどうかは要検討. 参照だけなら変更の必要はないという気もするが, index だけを得た後で default_undefined の値を変更すると, index が正しくなくなる可能性がある. とはいえ,read で書き換えが起こるとした場合は さらに困ったことになる可能性が高い. 参照だけならば encoding は変更せず,その後の扱いは 「自己責任」とするというのが妥当な線かも. 例えば,Marshal データに特定の encoding を想定している場合は 単純に default_undefined にその encoding を設定すればよいし, Marshal データの中に encoding 指定を含んでいる場合は, 文字列操作の前にその encoding を default_undefined に encoding をを設定すればよい. このケースに限らず,encoding 無指定は UNDEFINED_8BIT にするとすれば encoding を与えられて困るケースと与えられなくて困るケースとの 両方に対応できそうな気がします. # コマンドラインから Encoding.default_undefined が与えられれば... $KCODE への設定が Encoding.default_undefined への設定と なるようにすれば,互換性を保ちやすくなるのではないかと 思えるのですが... -- 永井 秀利 (九工大 知能情報) nagai@ai.kyutech.ac.jp