Feature #3328
Updated by nahi (Hiroshi Nakamura) almost 13 years ago
=begin 樽家です。 Feature #2102 [ruby-dev:39343] でString#inspectについては強制的にencodingを揃えるようになりましたが、SymbolやRegexpについてはそうなっておらず、同じような簡単にエラーになる状態になっています。ユーザー定義のinspectにも同様です。またにinspectで文字コードの違いが区別できません。 そこで、Kernel#pで表示する前やArrayやHashで各inspect結果をマージする前に、String#inspectと同様な処理を行うのはどうでしょうか?具体的にはinspectで想定するEncodingと異なる場合に、非ASCII文字をエスケープ表示にするString#inspect_encodeを追加し、それをrb_inspectから呼ぶ事を提案したいと思います。ASCII文字については手を加えないため、不可逆ですが実用上は問題ないと思います。 ご検討をお願いします。 以下に現状と提案後の結果、Kernel#pの定義の変更を示します。 またこの変更を行うpatchを添付します。 >cat inspect.rb # -*- encoding: utf-8 -*- Encoding.default_external = "WINDOWS-31J" STDOUT.set_encoding "WINDOWS-31J" a = "あ" su = a.intern se = a.encode("euc-jp").intern sw = a.encode("windows-31j").intern ru= /#{a}/ re= /#{a.encode("euc-jp")}/ rw= /#{a.encode("windows-31j")}/ hash = { su => se } p su,se,sw,ru,re,rw p hash rescue p $! p [ru,re,rw,su,se,sw] rescue p $! >ruby_org inspect.rb :あ :あ :あ /あ/ /あ/ /あ/ #<Encoding::CompatibilityError: incompatible character encodings: UTF-8 and EUC-JP> #<Encoding::CompatibilityError: incompatible character encodings: UTF-8 and EUC-JP> >ruby_new inspect.rb :\u3042 :\x{A4A2} :あ /\u3042/ /\x{A4A2}/ /あ/ {:\u3042=>:\x{A4A2}} [/\u3042/, /\x{A4A2}/, /あ/, :\u3042, :\x{A4A2}, :あ] また、 Encoding.default_external = "WINDOWS-31J" STDOUT.set_encoding "WINDOWS-31J" class A ;def inspect ; "あ".encode("euc-jp") end ; end p A.new puts A.new.inspect puts A.new.inspect.inspect_encode の結果が \x{A4A2} あ \x{A4A2} となり、pの定義が少し変わります。 =end