🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C++

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

Q&A

解決済

1回答

1361閲覧

WriteConsoleOutput();関数で日本語だけが文字化けする原因が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

C++

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

0グッド

0クリップ

投稿2020/12/18 04:18

編集2020/12/19 11:01

提示コードの**// -- コメント部のコードですがなぜ文字化けするのでしょうか? setDraw();ボールドテキスト関数部ですが
まず"あ"と入力したものがマルチバイト文字からwchar_t型文字に変換されます。その後
printf();関数でしっかりと"あ"という文字がwchar_t型での状態で確認されています。されで値をmScreenBuffer変数**に代入しているのですがなぜ文字化けするのでしょうか?printf();では普通に表示されるのですが原因がわかりません。また先頭バイトと後方バイトと指定しています。
printf()でデバックしましたがなぜ
mScreenBuffer変数
に値を入れると文字化けするの理解できません

cpp

1#include "DrawCharactor.hpp" 2 3// コンストラクタ 4DrawCharactor::DrawCharactor() 5{ 6 fopen_s(&fp,"Log.txt","w"); //ファイル 7 8 9 //描画開始座標 10 mDraw_start.X = 0; 11 mDraw_start.Y = 0; 12 13 //描画範囲 14 mDraw_size.X = MAX_WIDTH; 15 mDraw_size.Y = MAX_HEIGHT; 16 17 //ウインドウサイズ 18 mRect.Left = (SHORT)0; 19 mRect.Top = (SHORT)0; 20 mRect.Right = (SHORT)MAX_WIDTH; 21 mRect.Bottom = (SHORT)MAX_HEIGHT; 22 23 // バッファーを作成 24 mHandle = CreateConsoleScreenBuffer(GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CONSOLE_TEXTMODE_BUFFER, NULL); 25 26 SetConsoleActiveScreenBuffer(mHandle); //有効にする 27 28 if (mHandle == INVALID_HANDLE_VALUE){ 29 fprintf(fp, "Invalid: INVALID_HANDLE_VALUE \n"); 30 } 31 32 // 画面バッファサイス変更 33 if (SetConsoleScreenBufferSize(mHandle, mDraw_size) == 0) { 34 fprintf(fp,"Invalid: SetConsoleScreenBufferSize(); \n"); 35 } 36 37 // 画面サイズ変更 38 if (SetConsoleWindowInfo(mHandle, TRUE, &mRect) == 0) { 39 fprintf(fp, "Invalid: SetConsoleWindowInfo(); \n"); 40 } 41} 42 43// バッファーに文字を書き込む 44void DrawCharactor::setDraw(const char* format, ...) 45{ 46 47 va_list ap; 48 char str[MAX_WIDTH]; 49 va_start(ap, format); 50 vsprintf_s(str, sizeof(str), format, ap); 51 va_end(ap); 52 53 wchar_t wc[MAX_WIDTH]; 54 size_t size = sizeof(wc); 55 56 size_t count = sizeof(wc) / sizeof(wchar_t); 57 mbstowcs_s(&size, wc, count, str, count - 1); //マルチ文字をワイド文字に変換 58 59// printf("%zu: [%ls]\n", size, wc); 60// printf("%zu: [%lc]\n", size, wc[0]); 61 62 printf("%ls\n",wc); 63 64 // ----------------------------------------------------------------------------------------------- 65 mScreenBuffer[0][0].Char.UnicodeChar = wc[0]; 66 mScreenBuffer[0][0].Attributes = FOREGROUND_GREEN | COMMON_LVB_LEADING_BYTE; 67 68 mScreenBuffer[0][1].Char.UnicodeChar = wc[0]; 69 mScreenBuffer[0][1].Attributes = FOREGROUND_GREEN | COMMON_LVB_TRAILING_BYTE; 70 // ----------------------------------------------------------------------------------------------- 71 //fprintf(fp, "ああああ\n"); 72} 73 74// 描画 75void DrawCharactor::GenerateOutput() 76{ 77 WriteConsoleOutput(mHandle,mScreenBuffer[0], mDraw_size, mDraw_start, &mRect); //現在のカーソル位置から始まる文字列をコンソール画面バッファーに書き込み 78 // mNowBuffer_height = 0; 79 // mNowBuffer_width = 0; 80 81} 82 83// デストラクタ 84DrawCharactor::~DrawCharactor() 85{ 86 // スクリーンバッファを解放 87 CloseHandle(mHandle); 88 mHandle = NULL; 89 90 fclose(fp); 91 92}

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

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

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

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

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

guest

回答1

0

ベストアンサー

ソースを全部見せてください。
質問のコード以外で変なことをしているはずです。
例えば、main の先頭で setlocale(LC_CTYPE, ""); を実行していないとか。

投稿2020/12/19 16:29

kazuma-s

総合スコア8224

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

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

退会済みユーザー

退会済みユーザー

2020/12/20 00:41

main関数でsetlocale(LC_CTYPE, ""); をしていませんでした、
kazuma-s

2020/12/20 01:29

なぜ setlocale が必要か理解していますか? WriteConsoleOutput に関する質問を繰り返していますが、 本当にその関数の意味や引数の意味を理解していますか? 回答をもらって、コードをコピペしたら動いたから解決だと思っていませんか? 回答の意味を全部理解していないから何度も同じ質問をするのではないでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問