From: Hiroshi NAKAMURA Date: 2011-06-26T16:12:25+09:00 Subject: [ruby-dev:43908] [Ruby 1.9 - Bug #4281] irb don't start up when Encoding.defalut_internal isn't 'utf-8' Issue #4281 has been updated by Hiroshi NAKAMURA. Target version changed from 1.9.2 to 1.9.3 ---------------------------------------- Bug #4281: irb don't start up when Encoding.defalut_internal isn't 'utf-8' http://redmine.ruby-lang.org/issues/4281 Author: Narihiro Nakamura Status: Assigned Priority: Normal Assignee: Keiju Ishitsuka Category: lib Target version: 1.9.3 ruby -v: ruby 1.9.2p136 (2010-12-25 revision 30365) [i686-linux] =begin nariです。 以下のようにすると irb が起動しません。 $ ruby -S -E cp932:cp932 irb /home/nari/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/irb/locale.rb:135:in `eval': /home/nari/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/irb/lc/ja/error.rb:16: invalid multibyte char (UTF-8) (SyntaxError) /home/nari/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/irb/lc/ja/error.rb:16: invalid multibyte char (UTF-8) /home/nari/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/irb/lc/ja/error.rb:16: syntax error, unexpected $end, expecting keyword_end def_exception :UnrecognizedSwitch, 'スイッチ(%s)が分りません' ^ from /home/nari/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/irb/locale.rb:135:in `real_load' from /home/nari/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/irb/locale.rb:125:in `block in load' from /home/nari/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/irb/locale.rb:123:in `each' from /home/nari/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/irb/locale.rb:123:in `load' from /home/nari/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/irb/init.rb:122:in `init_error' from /home/nari/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/irb/init.rb:17:in `setup' from /home/nari/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/irb.rb:53:in `start' from /home/nari/.rvm/rubies/ruby-1.9.2-p136/bin/irb:16:in `
' 再現コードは以下です。 $ cat /tmp/t.rb require "irb" Encoding.default_internal = "cp932" Encoding.default_external = "cp932" # pathはRubyのインストール先に合わせて変えてください path = "/home/nari/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/irb/lc/ja/error.rb" src = IRB::MagicFile.open(path){|f| f.read} p src eval(src) $ ruby /tmp/t.rb # /tmp/t.rb:8:in `eval': (eval):16: invalid multibyte char (UTF-8) (SyntaxError) (eval):16: invalid multibyte char (UTF-8) (eval):16: syntax error, unexpected $end, expecting keyword_end def_exception :UnrecognizedSwitch, 'スイッチ(%s)が分りません' ^ from /tmp/t.rb:8:in `
' cp932に変換された文字列(src)の中に、utf-8を指定するマジックコメントが入っ ており、utf-8の文字列としてeval()されるのが原因のようです。 Encoding.default_internalが指定されるようなケースまで標準ライブラリが対 応する必要はないのかもしれませんが、情報共有の意味も込めて報告しておき ます。 この問題については以下のパッチで直ることを確認しています。 diff --git a/lib/irb/magic-file.rb b/lib/irb/magic-file.rb index 8612620..339ed60 100644 --- a/lib/irb/magic-file.rb +++ b/lib/irb/magic-file.rb @@ -8,9 +8,10 @@ module IRB line = io.gets line = io.gets if line[0,2] == "#!" encoding = detect_encoding(line) + internal_encoding = encoding encoding ||= default_src_encoding io.rewind - io.set_encoding(encoding, nil) + io.set_encoding(encoding, internal_encoding) if block_given? begin =end -- http://redmine.ruby-lang.org