2014年8月7日木曜日

VisualC++2013とClang3.4.2でソースコードを共通にする際に日本語を使う

参考にしたページ:

http://d.hatena.ne.jp/osyo-manga/20110406
http://blog.cppcms.com/post/105


確認環境

  • Windows7 x64 with SP1 日本語版
  • VisualStudio2013 update1 日本語版
  • Cygwin(2014/08/06時点での最新版をALL Install → clang3.4.2がついてきた)


やり方

BOMつきUTF-8ファイルにし、先頭に以下を入れる:

#if defined(_MSC_VER)
#pragma execution_character_set("utf-8")
#endif

それをコンソールに出力する場合、Windows環境では以下のようにする:

_setmode(::_fileno(stdout), _O_U16TEXT);
    // _O_U8TEXT にして printf を使うと実行時エラーになって落ちる。
auto len = strlen(text);
wchar_t converted[1024];
auto len2 = MultiByteToWideChar(CP_UTF8, 0, text, len, converted, 1024);
if(len2 != 0)
{
    converted[len2] = 0;
    wprintf(converted);
}

その他

Linuxでビルドしたclangも同じ動作かどうかは未確認。
VisualStudio2012はpragma execution_character_setが使えない(update4でも)。VisualStudio2010はOKらしい。