読者です 読者をやめる 読者になる 読者になる

Windows版Rubyでp メソッドが文字化けする件の回避(-Uオプション)

Ruby

いわゆるprintfデバッグに相当する pメソッドなのだが、漢字が正しく表示されない。
例えば

class Tel
  def initialize(number, name)
    @number = number
    @name   = name
  end
end

kyoto = Tel.new('075', '京都市')
p kyoto

を実行すると、ruby 1.9からだったと思うが、

> ruby  tel.rb                                            
#<Tel:0x2dcb764 @number="075", @name="\u4EAC\u90FD\u5E02">

のように悲しい結果になる。
試行錯誤の結果、どうやらEncoding.default_internal の問題の模様。
実際に

def show_enc                                               
  %i(default_external default_internal).each do |enc|      
    puts "Encoding.#{enc} => #{Encoding.send(enc).inspect}"
  end                                                      
end                                                        

class Tel
  def initialize(number, name)
    @number = number
    @name   = name
  end
end

kyoto = Tel.new('075', '京都市')
p kyoto

show_enc

とすると

> ruby tel.rb                                             
#<Tel:0x2dbb79c @number="075", @name="\u4EAC\u90FD\u5E02">
Encoding.default_external => #<Encoding:Windows-31J>      
Encoding.default_internal => nil                                                   

となっている。
そこで、-U オプションを付けてやると

> ruby -U tel.rb                                     
#<Tel:0x2f1ab10 @number="075", @name="京都市">          
Encoding.default_external => #<Encoding:Windows-31J> 
Encoding.default_internal => #<Encoding:UTF-8>       

と幸せになれるという次第。
環境変数RUBYOPTに-Uを設定しておくと手間もかからない。

ただし、Rubyinstallerのruby.exeだと何故かエラーになることがある。
環境にもよるようだが、ASRだと今のところ問題なし。