二兎を追う者は一兎をも得ず

この記事はUTF-8は2度、3度死ぬ(その1)の最後の部分の続きです。


その1の最後でC++のストリームI/Oを捨て去った闇鳥ですが、何かメンバ関数にあったよなぁと、性懲りも無く記憶の底とヘッダーを探ると、ありましたありました、基底クラスbasic_iosのimbue()!しかし、行き着く先は、やっぱり、setlocaleで指定するWindowsロケール文。UTF-8等を受け付けない腰抜け野郎の壁に阻まれるのでした。

さて、私は何処でしょう

あきらめて、MS932とUTF-8は、別々の道を進むしかないと判断するわけですが、よく考えると、UNIXはこれをロケールでカバーしていますが、それに期待できないWindowsは、どうすれば良いのでしょう?自分がMS932とUTF-8どちらで動いているのか、どうやって判断するのでしょう。
文献を引っ繰り返すも取っ掛かりが少なく、見つけたと思っても、またもやロケール…。半分諦め掛けたそのとき、ようやく当たりを引き当てたのです。
そう、ついにWINAPI GetConsoleOutputCP()に、たどり着いたのです。
http://msdn.microsoft.com/en-us/library/windows/desktop/ms683169%28v=vs.85%29.aspx
いやー楽しそうな関数が一杯並んでますな〜と思いつつ、当初の目的のGetConsoleOutputCP()を試します。
ソースサンプル(hoge.c)

#include <stdio.h>
#include <windows.h>

int
main()
{
    printf("%d\n", GetConsoleOutputCP());

    return 0;
}

で、chcp 932のプロンプトで実行すると「932」が、chcp 65001のプロンプトで実行すると「65001」が得られます。
しめしめ、使えるではないかと思ってほくほく…。しかし、よく考えるとMS932用のソースとUTF-8用のソースを一つに混ぜるか?と、基本的な疑問が……うん、混ぜないな。結局、どっちも無駄骨なのでした。