Project

General

Profile

Actions

Feature #3328

closed

Kernel#p outputs as default_internal encoding, and so on

Added by tarui (Masaya Tarui) almost 14 years ago. Updated over 6 years ago.

Status:
Rejected
Target version:
[ruby-dev:41382]

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

patch (4.68 KB) patch Kernel#pほか変更パッチ tarui (Masaya Tarui), 05/21/2010 08:10 AM
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0