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

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

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

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

Q&A

解決済

2回答

1217閲覧

wchar_t型の中身が日本語か英語かどうか識別したい。

退会済みユーザー

退会済みユーザー

総合スコア0

C++

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

0グッド

0クリップ

投稿2020/12/16 13:14

wchar_t型の中身が英語か日本語かで識別したいのですがどうすればいいのでしょうか?提示コードのここですの部分に載せたいです。ライブラリ関数などあるのでしょうか?

cpp

1#include "stdio.h" 2#include "stdlib.h" 3#include <Windows.h> 4 5#include "KeyInput.hpp" 6#include "DrawCharactor.hpp" 7 8#include "stdio.h" 9#include "stdlib.h" 10#include <Windows.h> 11 12#include "KeyInput.hpp" 13 14// ウインドウサイズ 15#define MAX_WIDTH ((int)100) 16#define MAX_HEIGHT ((int)40) 17 18FILE* fp = NULL; 19 20 21void print_(wchar_t wc[], size_t size, const char* format, ...) 22{ 23 24 //printf("%s\n\n\n\n",format); 25 26 //文字を生成 27 std::string text; //生成した文字を格納 28 va_list ap; 29 30 char str[50]; 31 va_start(ap, format); 32 vsprintf_s(str, sizeof(str), format, ap); 33 va_end(ap); 34 35 setlocale(LC_CTYPE, ""); 36 size_t count = size; 37 mbstowcs_s(&size, wc, count, str, count - 1); 38 39 //printf("%zu: [%ls]\n", size, wc); 40 //printf("っs\n"); 41 42} 43 44 45int main() 46{ 47 fopen_s(&fp, "Log.txt", "w"); 48 49 50 51 52 53 HANDLE mhScreen; //ウインドウハンドル 54 COORD mDraw_start; //描画開始位置 55 COORD mDraw_size; //画面のサイズ 56 _SMALL_RECT mRect; //画面の描画範囲 57 int mNowBuffer_width = 0; 58 int mNowBuffer_height = 0; 59 60 mhScreen = nullptr; //ウインドウハンドル 61 62 //描画開始座標 63 mDraw_start.X = 0; 64 mDraw_start.Y = 0; 65 66 //描画範囲 67 mDraw_size.X = MAX_WIDTH; 68 mDraw_size.Y = MAX_HEIGHT; 69 70 //ウインドウサイズ 71 mRect.Left = (SHORT)0; 72 mRect.Top = (SHORT)0; 73 mRect.Right = (SHORT)MAX_WIDTH; 74 mRect.Bottom = (SHORT)MAX_HEIGHT; 75 76 int num = 0; 77 78 // バッファーを作成 79 mhScreen = CreateConsoleScreenBuffer(GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CONSOLE_TEXTMODE_BUFFER, NULL); 80 81 if (mhScreen == INVALID_HANDLE_VALUE) 82 { 83 fprintf(stderr, "INVALID_HANDLE_VALUE"); 84 } 85 86 87 SetConsoleScreenBufferSize(mhScreen, mDraw_size); // バッファサイズ変更 88 SetConsoleWindowInfo(mhScreen, TRUE, &mRect); // ウィンドウサイズ変更 89 //mhScreen = CreateConsoleScreenBuffer(GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CONSOLE_TEXTMODE_BUFFER, NULL); 90 mhScreen = CreateConsoleScreenBuffer(GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CONSOLE_TEXTMODE_BUFFER, NULL); 91 SetConsoleActiveScreenBuffer(mhScreen); // 有効化 92 93 CHAR_INFO mWindowBuffer[MAX_HEIGHT * MAX_WIDTH] = { 0 }; 94 95 96 97 KeyInput ki; 98 99 100 101 wchar_t wc[100]; 102 int a = 3; 103 print_(wc, sizeof(wc) / sizeof(wchar_t), "AAA: %d", a); 104 105 printf("ああああ: [ %lc ]\n",wc[0]); 106 107 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 108 while (true) 109 { 110 111/* 112///////////////ここに書きたい 113*/ 114 mWindowBuffer[0].Char.UnicodeChar = wc[0]; 115 mWindowBuffer[0].Attributes = FOREGROUND_GREEN | COMMON_LVB_LEADING_BYTE; 116 117 mWindowBuffer[1].Char.UnicodeChar = wc[0]; 118 mWindowBuffer[1].Attributes = FOREGROUND_GREEN | COMMON_LVB_LEADING_BYTE; 119 120 mWindowBuffer[2].Char.UnicodeChar = wc[1]; 121 mWindowBuffer[2].Attributes = FOREGROUND_GREEN | COMMON_LVB_LEADING_BYTE; 122 123 mWindowBuffer[3].Char.UnicodeChar = wc[1]; 124 mWindowBuffer[3].Attributes = FOREGROUND_GREEN | COMMON_LVB_TRAILING_BYTE; 125 126 127 128 129 130 131 SetConsoleCursorPosition(mhScreen, mDraw_start); 132 WriteConsoleOutput(mhScreen, mWindowBuffer, mDraw_size, mDraw_start, &mRect); //現在のカーソル位置から始まる文字列をコンソール画面バッファーに書き込み 133 FlushConsoleInputBuffer(mhScreen); 134 } 135 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 136 137 138 // スクリーンバッファを解放 139 CloseHandle(mhScreen); 140 mhScreen = NULL; 141 142 143 fclose(fp); 144 145 146 return 0; 147}

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

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

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

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

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

guest

回答2

0

もしかして本当に必要なのは描画幅の問題でしょうか?その場合はUnicodeて一応定義があるので
https://github.com/mattn/go-runewidth
これみたいなことをやれば行けると思います。GoのライブラリなのでC++から呼び出すのはちょっと大変そうだけど、まあC++に手動で移植もそこまで手間じゃなさそう。

投稿2020/12/16 14:59

yumetodo

総合スコア5850

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

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

0

ベストアンサー

とりあえず、ナカミが0xff 以下であれば英語とみればいいのではないかと。

投稿2020/12/16 13:20

y_waiwai

総合スコア87774

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問