QA@IT

Windowsのコマンドラインにutf-8のまま出力すると文字化けするのに何か良い方法は?

7196 PV

Windowsのコマンドラインにutf-8のまま出力すると文字化けするのに何か良い方法は?
一時 WinodowsXPでコードページを変えて、フォントを選ぶとutf-8が文字化けしないで使えた記憶があるのですが、Winodws7では、うまくゆきません。
出力の都度、判定して、Shift_JISに変換してやるしかないのでしょうか?

回答

単にruby 1.9.3以降を使ってください。

編集 履歴 (0)
  • どうしても文字化けとなるものとならないものがあり、はまっていましたがやっと原因がわかりました。Ruby1.9.3でも`require "pry"`つけてると化けて、はずすと直りました。多謝! -

Rubyでの解決でなく質問に書いてある方法では、chcp 65001 でutf-8がそのまま表示できます。
フォントは、MeiryoKe_Console を使ってます。

編集 履歴 (0)
  • なるほど。ありがとうございます。 -

単にDOSプロンプト上で文字化けを回避するのであれば、rubyコマンドにエンコーディングを指定する方法はどうでしょうか?

手元のWindows 7の環境にRuby 1.9.3が無かったため、Ruby 1.9.2-p180で試しました。外部エンコーディングにShift_JIS、内部エンコーディングにUTF-8を指定することで文字化けせず表示できました。

試したソース(utf-8.rb):

# -*- coding: utf-8 -*-
msg = "こんにちは世界!"
puts msg
p Encoding.default_external
p Encoding.default_internal
p msg.encoding

とりあえず文字化けする例:

> ruby.exe -v utf-8.rb
ruby 1.9.2p180 (2011-02-18) [i386-mswin32_100]
縺薙s縺ォ縺。縺ッ荳也阜・
#<Encoding:US-ASCII>
nil
#<Encoding:UTF-8>

エンコーディングを指定して文字化けしない例:

> ruby.exe -v -Ecp932:utf-8 utf-8.rb
ruby 1.9.2p180 (2011-02-18) [i386-mswin32_100]
こんにちは世界!
#<Encoding:Windows-31J>
#<Encoding:UTF-8>
#<Encoding:UTF-8>

また、Ruby 2.0.0-preview1 ではエンコーディングを指定しなくても文字化けしませんでした:

> ruby.exe -v utf-8.rb
ruby 2.0.0dev (2012-11-01) [x64-mswin64_110]
こんにちは世界!
#<Encoding:Windows-31J>
nil
#<Encoding:UTF-8>
編集 履歴 (0)
  • 最初の回答を見てRuby前提だと思い込んで回答してしまいました。すみません。 -
  • おぉ~外部エンコーディングにShift_JISを指定するという技があるのですね。素晴らしい!ヴぉRuby2.0も何て素晴らしいの。情報ありがとうございます!! さしあたりばっちりRuby前提でした。 -

もし msysgit をインストールしているのであれば cat にパイプしてみるとか

D:\>type utf8.txt
縺ゅ>縺・∴縺・

D:\>type utf8.txt|cat
あいうえお
編集 履歴 (0)
  • なるほど!msysgit環境では cat にパイプでOKですね!ありがとうございます! -

さしあたり自分で標準出力に出している分は次のメソッドで内部で切り替えでしのぎました。Ruby1.9.3です。

def ppp ( str )
  if(RUBY_PLATFORM.downcase =~ /mswin(?!ce)|mingw|cygwin|bccwin/)
    puts str.encode('Shift_JIS')
  else
    puts str
  end
end

putsやprintの代わりに pppを使う。

判定は以下を参考にしました。
http://pools.jp/2008/03/15/ruby-os-windows-%E5%88%A4%E5%AE%9A/

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。