プロが教える店舗&オフィスのセキュリティ対策術

コマンドプロンプト上で、UTF-8のexeファイルを実行してみたのですが、文字化けしてしまいます。

コマンドプロンプトの設定で、フォントを「MSゴシック」には変更しました。
後、「chcp 65001」も実行しています。
typeコマンドでUTF-8のテキストファイルの中身を見た場合は文字化けが起こりません。


以下、環境を書いておきます。
OS: Windows 7 Home Premium 32bit
コンパイラ: MinGW gcc 4.6.2


文字コードをUTF-8にしたままでOKな改善策があれば、ご教授お願いします。

A 回答 (5件)

手元にある 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
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

こちらでも、printfを使うと文字化けが起こらなかったです。
それに対し、coutを使うと文字化け……。
なお、リダイレクトで出力結果を見た場合は、両方の場合とも、普通に読めました。

教えていただいた質問の方ですが、regeditを使う方法は効果なしでした。
後はcygwin + TeraTermという解決策しかなさそうですかね?
そうなると現状のままでいいかな、という心情です。printfを使えば問題ないので。

お礼日時:2012/07/18 00:28

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」を入れたら実行時エラーになりました。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

こちらも同じような結果です。
それで、localeに「ja_JP.UTF-8」を入れた時に出る実行時エラーのwhat()を検索してみましたが、どうやらcoutの問題ではなく、libstdc++の方の問題みたいです。

http://d.hatena.ne.jp/eagletmt/20090208/1234086332

なので、C++でlocale設定を使うのは、とりあえず諦めることにします。

お礼日時:2012/07/18 13:24

>こちらでも、printfを使うと文字化けが起こらなかったです。


>それに対し、coutを使うと文字化け……。

試したワケではありませんが……
「cout ロケール」で検索してみたら下記のようなページが。
http://www.kijineko.co.jp/tech/cppsamples/stdout …

使えるか判りませんが、wcoutではどうなのでしょう??
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

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

お礼日時:2012/07/18 13:30

c++にて試したところ、こちらでも同じ症状となりました。



簡単に思いつくことは試しましたが解決できず、原因もわかりません。

printfを使うことで回避可能であればそれが一番いいと思います。
    • good
    • 0

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

    • good
    • 0
この回答へのお礼

回答ありがとうございます。

プログラムは、累乗計算を行なって、処理時間を文字で表示するものです。
MinGWのg++で、UTF-8エンコード(CRLF)のソースファイルを、とくにオプションを付けずにコンパイルしました。
gccのデフォルトがUTF-8みたいなので、UTF-8にはなっていると思うのですが…。

実行時は、CP932のときは「秒」が「遘・」と文字化けします。
CP65001のときは「秒」(コピー&ペースト)という3文字になります。
(表示は「γ」「『○』の下に『_』」「『f』と『E』の合字みたいな文字」)

なお「-finput-charset=UTF-8」, 「-fexec-charset=UTF-8」をオプションを付けても変化なしです。

お礼日時:2012/07/17 08:46

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!