From: "naruse (Yui NARUSE)" Date: 2013-10-10T10:56:07+09:00 Subject: [ruby-dev:47755] [ruby-trunk - Bug #8995] バイナリデータを文字列として encode! すると readbyte の結果が変化する Issue #8995 has been updated by naruse (Yui NARUSE). なかださんの指摘の通り、 > return params.force_encoding("UTF-8").encode! の行は何がしたいのかよくわかりませんね。 本当は > return params.force_encoding("UTF-16").encode! とやって、まさに Ruby 2.1 の挙動にしたかったのかな。 結論もなかださんの仰るとおり、 バイナリデータフラグを加えるか、ASCII-8BITで流すかあたりになるんじゃないかと思います。 ---------------------------------------- Bug #8995: バイナリデータを文字列として encode! すると readbyte の結果が変化する https://bugs.ruby-lang.org/issues/8995#change-42402 Author: hsbt (Hiroshi SHIBATA) Status: Third Party's Issue Priority: Normal Assignee: Category: core Target version: current: 2.1.0 ruby -v: ruby 2.1.0dev (2013-10-07 trunk 43160) [x86_64-darwin12.5.0] Backport: 1.9.3: UNKNOWN, 2.0.0: UNKNOWN =begin Rails の以下のコードの結果が 2.0 と 2.1 とで異なるようです。 (()) 以下が最小ケースです。 $ ruby -v => ruby 2.1.0dev (2013-10-07 trunk 43160) [x86_64-darwin12.5.0] $ ruby -rstringio -e "Encoding.default_internal = Encoding::UTF_8; p StringIO.new(File.read('x.jpg')).readbyte" => 255 $ ruby -rstringio -e "Encoding.default_internal = Encoding::UTF_8; p StringIO.new(File.read('x.jpg').force_encoding('UTF-8').encode\!).readbyte" => 239 なお、2.0 ではそれぞれの値が変化しませんでした。 $ ruby -v => ruby 2.0.0p326 (2013-10-05 revision 43144) [x86_64-darwin13.0.0] $ ruby -rstringio -e "Encoding.default_internal = Encoding::UTF_8; p StringIO.new(File.read('x.jpg')).readbyte" => 255 $ ruby -rstringio -e "Encoding.default_internal = Encoding::UTF_8; p StringIO.new(File.read('x.jpg').force_encoding('UTF-8').encode\!).readbyte" => 255 rails の該当箇所は rails4 でも同じ処理を行っているので、このままだと post で画像などを送るともれなく壊れてしまいます。 rails のコードがよくないのか、File.binread を使って読み込んでないのがおかしいなど教えて頂けると嬉しいです。 =end -- http://bugs.ruby-lang.org/