🎫
Windowsのコマンドプロンプトで色付き文字やUnicodeを表示する。
背景
Windowsでコンソールアプリを作る際、コンソールに色付き文字やUnicodeでデバッグ出力などをしたいことがありました。気分が上がるという理由だけですが。
色付き文字
こういうの↓
getStdHandle()
とsetConsoleMode()
を使うことで表示させることができるようになります。
以下nimのコードですが、C++とほぼ同じなのでご容赦ください。
要は重要なのはgetStdHandle()とsetConsoleMode()の使い方です。
const ENABLE_PROCESSED_OUTPUT = 0x0001
const ENABLE_WRAP_AT_EOL_OUTPUT = 0x0002
const ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x0004
const MODE = ENABLE_PROCESSED_OUTPUT + ENABLE_WRAP_AT_EOL_OUTPUT + ENABLE_VIRTUAL_TERMINAL_PROCESSING
var handle = getStdHandle(-11)
setConsoleMode(handle, MODE)
# ここに色を変える系の処理を書く。
これは僕がnimで作った色付き文字を表示するライブラリcolorizeEchoで使っているコードです。
重要なのは以下↓
-
getStdHandle()
の引数に-11を入れると、stdoutのハンドルが手に入ります。 -
setConsoleMode()
にハンドルと、有効にしたいオプションを渡すことで設定できます。各オプションについてはMSDocを参照ください!
Unicodeを表示する。
例えばこういうヘッダー的なのとか↓
_setmodeという関数を使います。
#include <fcntl.h>
#include <io.h>
#include <stdio.h>
#define PRINT_HAHA() {\
wprintf(\
L" ██░ ██ ▄▄▄ ██░ ██ ▄▄▄ \n"\
L"▓██░ ██▒▒████▄ ▓██░ ██▒▒████▄ \n"\
L"▒██▀▀██░▒██ ▀█▄ ▒██▀▀██░▒██ ▀█▄ \n"\
L"░▓█ ░██ ░██▄▄▄▄██ ░▓█ ░██ ░██▄▄▄▄██ \n"\
L"░▓█▒░██▓ ▓█ ▓██▒░▓█▒░██▓ ▓█ ▓██▒ \n"\
L" ▒ ░░▒░▒ ▒▒ ▓▒█░ ▒ ░░▒░▒ ▒▒ ▓▒█░ \n"\
L" ▒ ░▒░ ░ ▒ ▒▒ ░ ▒ ░▒░ ░ ▒ ▒▒ ░ \n"\
L" ░ ░░ ░ ░ ▒ ░ ░░ ░ ░ ▒ \n"\
L" ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ \n"\
L" \n"\
); \
}
int main() {
int oldMode = _setmode(_fileno(stdout), _O_U16TEXT);
PRINT_HAHA();
_setmode(_fileno(stdout), oldMode);
return 0;
}
ここでマクロの部分で2つハマりポイントがあります。(別にマクロである必要はないけど)
-
wprintf
を使うこと。- 今回のような生のUnicodeをコードに書く場合ワイド文字用の関数である
wprintf
を使う必要がある。
- 今回のような生のUnicodeをコードに書く場合ワイド文字用の関数である
-
(空白)L""
で囲う必要がある。- 例のように複数行にする場合はLの左側に半角スペースがないといけない。
- ↑コンパイラの「空白を挟んだ文字列リテラルを合体させる」という性質を使っているため。
ちなみにMSdocsのExampleではこんなUnicodeべた書きじゃなくて以下のようにエスケープしていました。
wprintf(L"\x043a\x043e\x0448\x043a\x0430 \x65e5\x672c\x56fd\n");
_setmode()
はMSdocsのExampleを参考にしただけです。
Discussion