コマンドプロンプトで文字コードがUTF-8のテキストを表示する

コマンドプロンプトは、Shift-JISしか表示できないものと今まで思い込んでいました。しかしながら最近は、perlでプログラム組む場合も最初からUTF-8で書く事も多くなってきました。

そういう場合、Windows上のActivePerl環境で実行してテストするとき、コマンドプロンプトから実行するわけですが、その場合コマンドプロンプトはShift-JISなので表示が文字化けするんですね。これがとても不便なわけです。

もしかしたら、コマンドプロンプト上でUTF-8で文字を表示できるか、UTF-8が表示できるコマンドプロンプト代わりのプログラムがあるのではないかと思い検索してみると、コマンドプロンプトでUTF-8が表示できる事がわかりました。早速試してみました。

◇参考:コマンドプロンプトでUTF-8の文字を表示する。 – Perl入門~サンプルコードによるPerl入門~
http://d.hatena.ne.jp/perlcodesample/20080706/1215291523

この検証の環境はWindows XP HOME Edition SP3です。

1.とりあえず、適当な場所にコマンドプロンプトのショートカットと新規のテキストファイルtest.plを作成します。

XG000944

2.test.plをUTF-8文字コードが使えるテキストエディタで開いて、とりあえず1行の文字列を表示するコードを書いて、文字コードUTF-8で書き出します。

XG000945

3.そして、まだ何もしていない状態で、test.plを実行してみます。すると下の様に文字化けして何が表示されているかわからない状態です。これは、コマンドプロンプトがデフォルトではShift-JISしか表示できないためです。

XG000946

 

4.で、コマンドプロンプトで文字コードがUTF-8のテキストを表示する方法です。

コマンドプロンプトのショートカットを選択した状態で、マウスの右クリックをして「プロパティ」を選択します。

名称未設定-2

5.プロパティーを選択すると下のような画面になっています。「フォント」タブでフォントを「MS ゴシック」にします。 変更後[適用]または[OK]をクリックで設定を適用します。

XG000949

6.再度コマンドプロンプトを実行します。

「chcp 65001」と入力して<エンター>を押します。

XG000951

すると、下の様になります。

XG000952

7.この状態で再度、test.plを実行してみる。すると今度は文字化けしないで表示する事が出来た。

が、なんだこれ、文字がダブって表示されている。なんでしょう?「だよ」と「よ」ちょっとこれは困りますね。とりあえず、UTF-8を表示できるようにはなったのですが、これではちょっと使えないですね。とりあえず、表示を確認するだけには使えそうです。やっぱりファイルにリダイレクトしてテキストエディタで見るしかなさそうです。

 XG000954

 

実際、参考にしたページを見ると、現在はこの方法で正常に表示できないとあります。なるほど、そうですか、残念。

前はちゃんと表示できたらしいのですが、いつからかだめになったらしいです。

これ、そのうち直るのかな?

typeコマンドでファイルの中身を表示するだけなら、ダブって表示される事は無いようです。一旦、ファイルにリダイレクトして、それをtypeコマンドで表示するとかすればいいかも知れません。

それか、素直にVirtual PCやVMware上にLinuxインストールしてやった方がいいかもしれないですね。

※ちなみにWindows2000でも同様の問題が発生しました。

追記:2010年03月07日

結局、コマンドプロンプトにUTF-8の文字を表示するのは今のところ面倒(というかむり?)なので難しいことを考えずに、SHIFT_JISに変換してから表示してやるのが簡単だと思います。

use Encode::Guess qw/ascii utf8 euc-jp shiftjis 7bit-jis/;

print &toSHIFTJIS("UTF-8の文字列")."\n";

#====================================================================
#    文字コードをSHIFTJISに統一
#====================================================================
sub toSHIFTJIS{
    my $sTxt = $_[0];
    my $dec = Encode::Guess->guess($sTxt);
    if (ref $dec) {
        $sTxt = Encode::encode(‘cp932’, Encode::decode($dec->name, $sTxt));
    }elsif(($dec =~ /shiftjis/) or ($dec =~ /utf/)){
        $sTxt = Encode::encode(‘cp932’, Encode::decode_utf8($sTxt));
    }

    $sTxt;
}

OSの環境によって表示したい文字コードを切り替えたい場合は、下のようにすればいいし、もう一個関数かぶせてその中で切り分ければもっとスマートです。

my $str = “UTF-8の文字列”;

if($^O eq ‘MSWin32’){
  print &toSHIFTJIS($str)."\n";
}else{
  print “$str\n”;
}

タグ :