🎫

Windowsのコマンドプロンプトで色付き文字やUnicodeを表示する。

2022/10/06に公開

背景

Windowsでコンソールアプリを作る際、コンソールに色付き文字やUnicodeでデバッグ出力などをしたいことがありました。気分が上がるという理由だけですが。

色付き文字

こういうの↓

image

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を表示する。

例えばこういうヘッダー的なのとか↓

image

_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を使う必要がある。
  • (空白)L""で囲う必要がある。
    • 例のように複数行にする場合はLの左側に半角スペースがないといけない。
    • ↑コンパイラの「空白を挟んだ文字列リテラルを合体させる」という性質を使っているため。

ちなみにMSdocsのExampleではこんなUnicodeべた書きじゃなくて以下のようにエスケープしていました。

wprintf(L"\x043a\x043e\x0448\x043a\x0430 \x65e5\x672c\x56fd\n");

_setmode()MSdocsのExampleを参考にしただけです。

Discussion