Project

General

Profile

ActionsLike0

Bug #8995

closed

バイナリデータを文字列として encode! すると readbyte の結果が変化する

Added by hsbt (Hiroshi SHIBATA) over 11 years ago. Updated over 11 years ago.

Status:
Third Party's Issue
Assignee:
-
Target version:
ruby -v:
ruby 2.1.0dev (2013-10-07 trunk 43160) [x86_64-darwin12.5.0]
[ruby-dev:47747]

Description

=begin
Rails の以下のコードの結果が 2.0 と 2.1 とで異なるようです。

((<encode_params|URL:https://github.com/rails/rails/blob/3-2-stable/actionpack/lib/action_dispatch/http/parameters.rb#L51>))

以下が最小ケースです。

$ 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

Added by naruse (Yui NARUSE) over 11 years ago

Revision 95a6be1a

  • transcode.c (str_transcode0): don't scrub invalid chars if
    str.encode doesn't have explicit invalid: :replace.
    workaround fix for see #8995

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43802 b2dd03c8-39d4-4d8f-98ff-823fe69b080e

ActionsLike0

Also available in: Atom PDF