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