Forum: Ruby-dev Kernel#p outputs as default_internal encoding, and so on

C4e88907313843cf07f6d85ba8162120?d=identicon&s=25 yhara (Yutaka HARA) (Guest)
on 2012-10-25 14:49
(Received via mailing list)
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
https://bugs.ruby-lang.org/issues/3328#change-31569

Author: tarui (Masaya Tarui)
Status: Assigned
Priority: Normal
Assignee: tarui (Masaya Tarui)
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
This topic is locked and can not be replied to.