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

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

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

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

Q&A

解決済

2回答

2332閲覧

C++にて日本語を標準入力した際に日本語が表示されない(文字化け?)

mono12579

総合スコア1

C++

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

0グッド

0クリップ

投稿2021/11/26 14:37

編集2021/11/26 16:02

前提・実現したいこと

標準入力された日本語が文字化けせずに標準出力されること。 

ご教示の程よろしくお願いいたします。

発生している問題・エラーメッセージ

イメージ説明

上の画像の様に、ローマ字を入力した際には問題なく出力される。
日本語を入力すると日本語ではなく、
00(ppと出力される場合も有)が出力される(入力文字数に応じて0(p)が増えている)

該当のソースコード

C++

1#include <string> 2#include <iostream> 3 4 5using namespace std; 6 7int main(){ 8 9 string name; 10 11 cout << "お名前は:"; 12 cin >> name; 13 14 cout << "こんにちは" << name << "さん\n"; 15 16}

試したこと

chcp65001を入力し、当該exeファイルを実行するも問題は解消されず。

補足情報(FW/ツールのバージョンなど)

環境:windows10
コンパイラ:mingw-w64(及びLLVM←コンパイラとしてはこちらもインストールしてしまったが、基本的はmingw-w64をjsonで設定している)

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

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

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

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

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

Bull

2021/11/27 06:56

実行時の文字コード (エンコード) はなんでしょうか? コンソールのコードページは 65001 (UTF-8) ですか? 現状 Windows10 のコンソールはコードページを 65001 (UTF-8) にすると、日本語 (マルチバイト文字) の入力ができないようです。
mono12579

2021/11/27 11:30

ありがとうございます。 デフォルトはエンコード(UTF-8)となっています。 (SHIFT-JIS)の場合はソースコードの日本語が文字化けします。 その際の結果は、 PS C:\Users\mono3\Coding\c++> ./list0118.exe 縺雁錐蜑阪?ッ?シ?山田 縺薙s縺ォ縺。縺ッ山田縺輔s となっております。
pepperleaf

2021/11/28 09:44

簡単には、ソースをShift-JISで書く。 (VSCode の文字コードは変更可能)
guest

回答2

0

ベストアンサー

Windows10 では現状コンソールのコードページを 65001 (UTF-8) にすると、標準入力で日本語 (マルチバイト文字) が入力できないようです。(標準出力は UTF-8 で正常にできます)

確実なのはコンソールのコードページを 932 (Shift_Jis) にして、プログラムのエンコードも Shift_Jis にすることです。

ソースファイルのエンコードは何でもいいのですが、デフォルトでは UTF-8 なので、UTF-8 にすれば特にコンパイル時のオプション等は必要ないです。

コンパイル時に-fexec-charset=cp932を指定して、実行時のエンコードを Shift_Jis にすれば、日本語 (マルチバイト文字列) の入出力ができるようになります。


えっと、マルチバイト文字の標準入力ができないと言うと誤解を招きそうなので、少し補足します。
標準入力をリダイレクトして、ファイルから UTF-8 の文字列を読込むことは問題なくできます。
あるいは、パイプラインからも入力できます。

例えば、

CMD

1C:\tmp>echo 山田 | test.exe 2お名前は:こんにちは山田さん

と、いうことはできます。

後、標準入力でなくコンソールからですと、入力できるようになるかもしれません。
断定できないのは、MinGW-W64 の g++ ではライブラリの関係で難しいからです。
MSVC (Visual Studio) ならば、cgets などを使えばできるようになるのですが……

投稿2021/11/27 13:28

編集2021/11/28 05:41
Bull

総合スコア986

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

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

mono12579

2021/11/30 15:39

遅くなって申し訳ありません。 VScode上で文字コードShift-JISでコンパイルし、コンソール上で実行したところ、標準入力できました。
guest

0

次のコードを実行するとどういう結果になりますか?

C++

1#include <string> 2#include <iostream> 3using namespace std; 4 5int main(){ 6 string name; 7 for (char c : "山田") cout << hex << (c & 0xff) << ' '; // ★ 8 cout << "お名前は:"; 9 cin >> name; 10 for (char c : name) cout << hex << (c & 0xff) << ' '; // ★ 11 cout << "こんにちは" << name << "さん\n"; 12}

投稿2021/11/27 03:21

kazuma-s

総合スコア8224

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

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

mono12579

2021/11/27 11:25

ご回答ありがとうございます。 並びに返信が遅れてしまい申し訳ございません。 頂いたソースですが、chcp 932にて実行した場合は、 PS C:\Users\mono3\Coding\c++> ./test.exe e5 b1 b1 e7 94 b0 0 縺雁錐蜑阪・・山田 ・e 52 93 63 縺薙s縺ォ縺。縺ッ山田縺輔s です。 また、chcp 65001の場合は、 PS C:\Users\mono3\Coding\c++> ./test.exe e5 b1 b1 e7 94 b0 0 お名前は:山田 90 90 こんにちは           となります。VScodeのUTF-8がデフォルトのエンコードとなっています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問