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

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

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

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

Q&A

解決済

1回答

696閲覧

CHAR_INFO型にwchar_t型の変数を代入するが無いも表示されない理由が知りたい

退会済みユーザー

退会済みユーザー

総合スコア0

C++

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

0グッド

0クリップ

投稿2020/12/10 05:19

編集2020/12/10 06:50

提示コードですがなぜWriteConsoleOutput();関数で文字化けするのでしょうか?英語は文字化けしないのですが日本語は文字化けしてします。
WindowConsole変数の型はCHAR_INFO型です。どうすればいいのでしょうか? 色々実験しましたがどうしても表示されません。

※Visual Studio なのでマルチバイト文字を利用に設定を変更しましたが変わりません。

cpp

1 2// ------------------------------------------------------------------- 3void Main_Screen::GenerateOutput() 4{ 5 //WindowConsole[0].Char.AsciiChar = (char)"あ"; 6 //WindowConsole[0].Char.UnicodeChar = (char)"あ"; 7 8 //WindowConsole[0].Char.AsciiChar = (char)'あ'; 9 //WindowConsole[0].Char.UnicodeChar = (char)'あ'; 10 11 //WindowConsole[0].Char.UnicodeChar = (WCHAR)"あ"; 12 //WindowConsole[0].Char.UnicodeChar = (WCHAR)'あ'; 13 14 //WindowConsole[0].Char.UnicodeChar = (WCHAR)"A"; 15 //WindowConsole[0].Char.UnicodeChar = (WCHAR)"a"; 16 17 18 WindowConsole[0].Attributes = (DWORD)(100 * 100 * 100); 19 20 21 WriteConsoleOutput(hScreen, WindowConsole, coord_size, coord_start, &Rect); //現在のカーソル位置から始まる文字列をコンソール画面バッファーに書き込み 22 //FlushConsoleInputBuffer(hScreen); //コンソールの入力バッファーをフラッシュする 23} 24

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

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

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

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

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

guest

回答1

0

ベストアンサー

マルチバイト文字ではなく Unicode を使いましょう。

C++

1#define UNICODE 2#include <windows.h> 3#include <stdlib.h> // system 4 5int main() 6{ 7 system("cls"); 8 HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE); 9 CHAR_INFO buf[2 * 40] = { 0 }; 10 COORD bs = { 40, 2 }; // buffer size: X, Y 11 COORD bc = { 0, 0 }; // buffer coord: X, Y 12 SMALL_RECT rect = { 10, 3, 49, 4 }; // left, top, right, bottom 13 wchar_t s[2][20] = { 14 L"abcdefgあいうえおαβγ", 15 L"日本語 English アイウエオ" 16 }; 17 for (int i = 0; i < 2; i++) { 18 int k = i * 40; 19 for (int j = 0; j < 20 && s[i][j]; j++) { 20 if (s[i][j] < 0x1000 || s[i][j] > 0xff60) { 21 buf[k].Char.UnicodeChar = s[i][j]; 22 buf[k++].Attributes = FOREGROUND_GREEN; 23 } 24 else { 25 buf[k].Char.UnicodeChar = s[i][j]; 26 buf[k++].Attributes = FOREGROUND_GREEN | COMMON_LVB_LEADING_BYTE; 27 buf[k].Char.UnicodeChar = s[i][j]; 28 buf[k++].Attributes = FOREGROUND_GREEN | COMMON_LVB_TRAILING_BYTE; 29 } 30 WriteConsoleOutput(h, buf, bs, bc, &rect); 31 Sleep(200); 32 } 33 } 34}

0x1000 以上 0xff60以下の文字が全部全角文字と考えるのは無茶ですが、とりあえず動くでしょう。

投稿2020/12/16 18:36

編集2020/12/17 00:22
kazuma-s

総合スコア8224

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問