potisanのプログラミングメモ

趣味のプログラマーがプログラミング関係で気になったことや調べたことをいつでも忘れられるようにメモするブログです。はてなブログ無料版なので記事の上の方はたぶん広告です。記事中にも広告挿入されるみたいです。

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が必要なことなどが記載されています。