potisanのプログラミングメモ

プログラミング素人です。昔の自分を育ててくれたネット情報に少しでも貢献できるよう、情報を貯めていこうと思っています。Windows環境のC++やC#がメインです。

C++ Windows環境のMSVCで標準出力に日本語とASCII以外の文字を出力する

Windows環境で標準出力に(std::wcoutが認識する)日本語とASCII以外の文字を出力するには_setmode(_fileno(stdout), _O_U16TEXT);を呼び出します。この呼び出しの後、標準ライブラリはユニコードモードになるそうです。

#include <iostream>
#include <io.h>
#include <fcntl.h>

int wmain()
{
    // stdoutとwcout等の同期解除は任意
    // ios_base::sync_with_stdio(false);
    _setmode(_fileno(stdout), _O_U16TEXT);

    std::wcout << L"abcあ\u3044\u2013def" << std::endl;
}

std::wcout.imbue(std::locale("Japanese", std::locale::ctype))を使う方法では、日本語は正常に表示されますが\u2013(enハイフン)以降がwcout.fail() == trueとなって出力が停止します。

_setmodeおよび_O_U16TEXTの詳細はMicrosoft Docsを参照してください。_setmodeを出力後に使用する場合はfflushが必要なことなどが記載されています。