• ベストアンサー

コマンドプロンプト プログラム実行時の文字化け

コマンドプロンプト上で、UTF-8のexeファイルを実行してみたのですが、文字化けしてしまいます。 コマンドプロンプトの設定で、フォントを「MSゴシック」には変更しました。 後、「chcp 65001」も実行しています。 typeコマンドでUTF-8のテキストファイルの中身を見た場合は文字化けが起こりません。 以下、環境を書いておきます。 OS: Windows 7 Home Premium 32bit コンパイラ: MinGW gcc 4.6.2 文字コードをUTF-8にしたままでOKな改善策があれば、ご教授お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • luka3
  • ベストアンサー率72% (424/583)
回答No.2

手元にある MinGW 4.5.0 で試してみました。(Win7 Pro 64bit下) printf("秒\n"); するだけのソースをUTF-8で保存し、引数なしでコンパイルしました。 ・何もしていないコマンドプロンプトでの結果 遘・ ・フォントをMSゴシック、chcp 65001実行後の結果 秒 plot02さんの出力も「遘・」ですので、プログラムは問題ないのではないでしょうか。 試しにリダイレクトで出力結果を拾ってみてはどうですか(test.exe >output.txt) chcp前でもUTF-8形式で「秒」を確認できました。 chcpのトラブルのようですが、あまり情報がないですね。 こちらはどうでしょうか。 ・教えて!Ziddyちゃん - UTF-8を表示できるWindows環境下のコンソール http://ziddy.japan.zdnet.com/qa5051484.html

plot02
質問者

お礼

回答ありがとうございます。 こちらでも、printfを使うと文字化けが起こらなかったです。 それに対し、coutを使うと文字化け……。 なお、リダイレクトで出力結果を見た場合は、両方の場合とも、普通に読めました。 教えていただいた質問の方ですが、regeditを使う方法は効果なしでした。 後はcygwin + TeraTermという解決策しかなさそうですかね? そうなると現状のままでいいかな、という心情です。printfを使えば問題ないので。

その他の回答 (4)

  • luka3
  • ベストアンサー率72% (424/583)
回答No.5

wcout自体は先ほど試していたのですが、ロケールの指定はやっていませんでしたので試してみました。 locale loc(""); cout.imbue(loc); wcout.imbue(loc); cout << "秒1" <<endl; wcout << L"秒2" <<endl; 結果は、wcoutの方からは何も出力されませんでした。 (coutはNo.1のお礼にあるのと同じ文字化け) localeに「ja_JP.UTF-8」や「japanese」を入れたら実行時エラーになりました。

plot02
質問者

お礼

回答ありがとうございます。 こちらも同じような結果です。 それで、localeに「ja_JP.UTF-8」を入れた時に出る実行時エラーのwhat()を検索してみましたが、どうやらcoutの問題ではなく、libstdc++の方の問題みたいです。 http://d.hatena.ne.jp/eagletmt/20090208/1234086332 なので、C++でlocale設定を使うのは、とりあえず諦めることにします。

  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.4

>こちらでも、printfを使うと文字化けが起こらなかったです。 >それに対し、coutを使うと文字化け……。 試したワケではありませんが…… 「cout ロケール」で検索してみたら下記のようなページが。 http://www.kijineko.co.jp/tech/cppsamples/stdout.html 使えるか判りませんが、wcoutではどうなのでしょう??

plot02
質問者

お礼

回答ありがとうございます。 軽く調べた感じ、gccだと、C++のロケール設定ができないみたいです。 多分Visual C++の方だと成功するのかもしれません。 実装の問題みたいなので、難しいですね。

  • luka3
  • ベストアンサー率72% (424/583)
回答No.3

c++にて試したところ、こちらでも同じ症状となりました。 簡単に思いつくことは試しましたが解決できず、原因もわかりません。 printfを使うことで回避可能であればそれが一番いいと思います。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

具体的に「どういうプログラムを」「どう実行したときに」「どう文字化けするのか」はわかりませんか?

plot02
質問者

お礼

回答ありがとうございます。 プログラムは、累乗計算を行なって、処理時間を文字で表示するものです。 MinGWのg++で、UTF-8エンコード(CRLF)のソースファイルを、とくにオプションを付けずにコンパイルしました。 gccのデフォルトがUTF-8みたいなので、UTF-8にはなっていると思うのですが…。 実行時は、CP932のときは「秒」が「遘・」と文字化けします。 CP65001のときは「秒」(コピー&ペースト)という3文字になります。 (表示は「γ」「『○』の下に『_』」「『f』と『E』の合字みたいな文字」) なお「-finput-charset=UTF-8」, 「-fexec-charset=UTF-8」をオプションを付けても変化なしです。