Kernel#p outputs as default_internal encoding, and so on

Issue #3328 has been updated by yhara (Yutaka HARA).

Target version changed from 2.0.0 to next minor


Feature #3328: Kernel#p outputs as default_internal encoding, and so on

Author: tarui (Masaya T.)
Status: Assigned
Priority: Normal
Assignee: tarui (Masaya T.)
Category: core
Target version: next minor

=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