Feature #3328
closedKernel#p outputs as default_internal encoding, and so on
Description
=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
Files