From: "mame (Yusuke Endoh)" Date: 2012-04-25T19:45:32+09:00 Subject: [ruby-dev:45582] [ruby-trunk - Bug #4281] irb don't start up when Encoding.defalut_internal isn't 'utf-8' Issue #4281 has been updated by mame (Yusuke Endoh). Assignee changed from yugui (Yuki Sonoda) to keiju (Keiju Ishitsuka) Target version changed from 1.9.3 to 2.0.0 いしつかさん Yugui さんから反応ないみたいなんで、いしつかさんの方で対応して頂けますでしょうか。 とりあえず trunk でお願いします。 バックポートが必要かどうかは、trunk の後で考えましょう。 -- Yusuke Endoh ---------------------------------------- Bug #4281: irb don't start up when Encoding.defalut_internal isn't 'utf-8' https://bugs.ruby-lang.org/issues/4281#change-26192 Author: authorNari (Narihiro Nakamura) Status: Assigned Priority: Normal Assignee: keiju (Keiju Ishitsuka) Category: lib Target version: 2.0.0 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://bugs.ruby-lang.org/