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

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

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

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

Q&A

解決済

2回答

11301閲覧

C++ 日本語出力について

Kuro_EViL

総合スコア14

C++

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

1グッド

2クリップ

投稿2019/01/22 10:59

編集2019/01/22 11:55

前提・実現したいこと

初歩的な質問失礼いたします.

C++で日本語を出力することができなくなり,原因が分からず困っております.
使用環境はwindows10 , Visual Studio 2015 です

実行したコード

c++

1#include<string> 2#include<iostream> 3#include<stdio.h> 4using namespace std; 5 6int main(){ 7 cout << "ハローワールド"; 8 9 return 0; 10}

出力結果

イメージ説明

追記

set0gut1様に提案していただいた通りに実行した結果だとこのような出力結果になります.
イメージ説明

set0gut1👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

こんにちは。

どうもWindows 10のコマンドプロンプトの仕様が変わったようです。
コマンドプロンプトを起動し、左上のシステム・コントロール・アイコンを右クリック→オプション→「レガシ コンソールを使用する」にチェックを入れて再度実行するとうまくいくかもです。

標準のコマンドプロンプトの文字コードはShift-JIS(CP932)なので、普通にcout << "あいう";で日本語を表示できていたました。「レガシ コンソール」にするとその頃のコマンドプロンプトが動いているのだろうと思います。

また、ダメ元で、std::locale::global(std::locale("japanese"));を入れてみると新コンソールでも化けませんでした。

C++

1#include<string> 2#include<iostream> 3#include<stdio.h> 4using namespace std; 5 6int main(){ 7 std::locale::global(std::locale("japanese")); 8 cout << "ハローワールド\n"; 9 10 return 0; 11}

最終的にUTF-8を標準にするための「布石」かも?

文字コードの話を 第18回目 文字コードとVisual C++の悩み にて解説したことがあります。よかったら参考にされて下さい。
(上記仕様変更により、記事中のコマンドプロンプト用ツールはこのままでは動かないです。頭痛い。)

投稿2019/01/22 13:59

Chironian

総合スコア23272

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

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

pepperleaf

2019/01/22 14:46

VC++2017 Express コマンドラインで作成した実行プログラムでは特に問題無しです。 (Win10 cmd.exe上) ソース: Shift-JIS --> OK ソース: UTF-8(BOM付) --> OK ただし、どちらも chcp 932 (Shift-JIS) chcp 65001(UTF-8) にすると、どちらも文字化けするが、最初と最後の AsciiはOK (多分、出力が Shit-JIS) あと問題となりそうなのは、コンパイルオプション?
Kuro_EViL

2019/01/24 10:17

レガシーコンソールを使用するにチェックを無事出力することができました! 仕様がアップデート(?)されていたんですね 助かりました.丁寧に回答してくださり,ありがとうございます!!
guest

0

文字列がバッファに溜まったまま出力されずに終了してるやつですね。

cout << "ハローワールド" << endl; とすると想定通りの挙動になるのではないでしょうか。
改行したくなければ cout << "ハローワールド" << flush; とかでもいけます。

投稿2019/01/22 11:14

編集2019/01/22 11:14
set0gut1

総合スコア2413

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

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

Kuro_EViL

2019/01/22 11:20 編集

回答ありがとうございます! 試しに二つとも実行してみましたが,結果は変わらず「・」のみの出力でした... cout << "ハローワールド" << endl; cout << "ハローワールド" << flush; と記述しても出力される結果は上記の画像のままです...
set0gut1

2019/01/22 11:23

cout << "foo" << endl; cout << "ハローワールド" << endl; cout << "bar" << endl; このようにすると foo と bar は出力される状況でしょうか。
Kuro_EViL

2019/01/22 11:53

fooのみが出力されハローワールドとbarは出力されませんでした. 日本語出力が入るとその後のcoutも出力されなくなります...
pepperleaf

2019/01/22 11:54

ソースの文字コードは?
Kuro_EViL

2019/01/22 12:03

Shift-JISで保存されています.
set0gut1

2019/01/22 12:15

これ分かんないですね…。"ハローワールド"に制御文字が混入していたりとか…?
Chironian

2019/01/22 14:03

pepperleafさん 横からごめんなさい。VC++の場合、gccと違ってリテラルの文字コードはソースの文字コードに原則として左右されません。ソースがShift-JIS、BOM付きUTF-8のどちらの場合でも、”あいう"はShift-JISとなります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問