Windows版Rubyでp メソッドが文字化けする件の回避(-Uオプション)
いわゆる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だと今のところ問題なし。