質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

UTF-8

UTF-8は8ビット符号単位の文字符号化形式及び文字符号化スキームです。データ交換方式、ファイル形式としては、一般的にUTF-8が使われる傾向があります。

コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

3140閲覧

UTF-8を使用したC++のプログラムで日本語入出力ができない。

退会済みユーザー

退会済みユーザー

総合スコア0

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

UTF-8

UTF-8は8ビット符号単位の文字符号化形式及び文字符号化スキームです。データ交換方式、ファイル形式としては、一般的にUTF-8が使われる傾向があります。

コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2020/04/03 09:59

UTF-8で記述したC++のプログラムで日本語の入出力が上手くいかないです。
OSはWindows 10でコンパイラはmingwのgccをインストールしました。

cpp

1#include <iostream> 2#include <string> 3using namespace std; 4 5int main() { 6 string name; 7 cin >> name; 8 cout << "名前は" << name << "です。" << endl; 9 return 0; 10}

入力を"山田"とか日本語を入力すると出力結果が
"名前は です。"
という具合に表示されないです。
コマンドプロンプトとソースコードの文字コードを合わせてもだめです。
初歩的な質問で申し訳ないのですが、自分で調べてみてもよくわからないので教えていただけないでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pepperleaf

2020/04/03 12:17

入力を "山田"でなく、 "ABC"とかの半角英数字では?
退会済みユーザー

退会済みユーザー

2020/04/03 12:21

半角英数字ならしっかり出力されます。
Bull

2020/04/03 12:37

私もいろいろ調査しましたが、根本的な解決策は見付からなかったです。 ファイルからのリダイレクトかパイプラインなら入力出来ます。 例えば echo 山田 | プログラム などとすると出来ます。 解決策にはなりませんが、wsl なら日本語も入力出来るみたいです。 他には、ConsoleAPI を使用する方法もあるにはあります。
guest

回答2

0

コマンドプロンプトでchcp 65001のあと質問のプログラムを走らせると状況は再現しますね。

C++

1#include <iostream> 2#include <string> 3#include <cstring> 4using namespace std; 5 6int main() { 7 string name; 8 cin >> name; 9 cout << "名前は" << name << "です。" << endl; 10 cout << "c_str "<< strlen(name.c_str()) << endl; 11 cout << "string::length" << name.length() << endl; 12 for (int i = 0; i < name.length(); i++) { 13 cout <<" '" << name[i] << ":"<< (int)name[i] << endl; 14 } 15 return 0; 16}

Text

1>g++ test.cpp --input-charset=utf-8 --exec-charset=utf-8 2>a 3山田 4名前は です。 5c_str 0 6string::length2 7 ' :0 8 ' :0

何を解決したいかによりますけれど、C++言語のお勉強の過程で気になったこと、という話なら、あなたの間違いではないので「気にしない」ことにして、Shift JIS環境に合わせてやればよいと思います(コンソールはcp932、ソースもShiftJIS、できればコンパイル時に--input-charset=cp932 --exec-charset=cp932をつける)。

なお、私の手元で

text

1chcp 65001 2>copy con test.txt 3山田^z

^zはCTRL+zですが、これでtest.txtとしてサイズ2byteのファイルが出来て、バイナリエディタで覗くと 00 00 となっているので、これはWindowsレベルの問題、という気がします。

投稿2020/04/04 05:44

thkana

総合スコア7703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

同じ環境ですが、オプションなしでコンパイルして、そのままコマンドプロンプトで実行すると、

田中 蜷榊燕縺ッ田中縺ァ縺吶

になります。ということで、そちらとは何故か現象が違いますが、
g++ --exec-charset=cp932 -o foo foo.cppでどうでしょうか?

投稿2020/04/03 15:21

otn

総合スコア85901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2020/04/03 15:25

ああ、書かれているのは、コマンドプロンプトのコードページをutf-8に変更した状態での実行結果ですね。
退会済みユーザー

退会済みユーザー

2020/04/03 15:42

オプションありでコンパイルした結果正常に出力されました。ありがとうございます。 オプションについて日本語で書かれているサイトはありますか?
退会済みユーザー

退会済みユーザー

2020/04/03 15:45

文字化けを直すのにコマンドプロンプトのコードをutf-8に変更したら日本語が出力されなくなりました。
otn

2020/04/03 16:00

英語の man gcc に、-fexec-charset=~~ と載ってますが、日本語のman gccだと翻訳が追い付いてないですね。 fexec-charset でググると個人ブログの類が何件も引っ掛かりますが、一次資料は無さげです。 おっと、こんなページも。https://teratail.com/questions/152379
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問