Project

General

Profile

Feature #3328

Updated by nahi (Hiroshi Nakamura) over 10 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 
 

Back