ブルータスお前もか

windresがMS932のダメ文字対策(?)がされていないことから、ふっと気になる。gccってどうなんだろう…
と、言うわけで、使い回しで「printf("ファイル構成\n")」を試してみる。

>gcc main.c
main.c: In function 'main':
main.c:8:9: warning: unknown escape sequence: '\220' [enabled by default]

っく、貴様もか…。EUCUTF-8でしかgccを動かしてこなかったツケが、ここに回ってきたか。仕方が無いUTF-8で作成するか。
それが、地獄への一本道と知らずに進むのであった。
で、UTF-8に変換。

>gcc -Wall main.c

うむ、エラーは何も出ないな。じゃ、取りあえず実行。ぽちっ。

>a
繝輔ぃ繧、繝ォ讒区・

まあ当然だな。さて、UTF-8のプロンプトは…chcp 65001で良いのか…フォントが変わって気持ちが悪いが、こんなものか。気を取り直して、ぽちっ。

>chcp 65001
Active code page: 65001

>a
繝

は?1文字?MS932の方がまだマシだぞ?ロケールがおかしいのかな〜
てな訳で、何がsetlocale()で設定されたのか確認してみる。

>gcc -Wall main.c
>a
Japanese_Japan.932
繝

あれ〜?MS932のままだぞ。こいつのせいか?UTF-8ってJapanese_Japan.65001で良いのかな?って932のままってどういうこと??
という訳で、msdnにお伺いを掛けてみる。
http://msdn.microsoft.com/ja-jp/library/x99tb11d%28v=vs.80%29.aspx
ふむふむ、OSからロケールを引っ張ってくるから、動作しているコードページが何であれMS932のままなのだな!って今大事な所を読み飛ばしたぞ!!

使用できる言語、国/地域コード、およびコード ページには、Win32 NLS API でサポートされるものがすべて含まれます (ただし、UTF-7UTF-8 のように、1 文字に 3 バイト以上必要なコード ページは除きます)。UTF-7UTF-8 などのコード ページを指定した場合、setlocale は実行に失敗し、NULL が返されます。

は?…(暫く固まる)…はぁぁぁぁぁぁぁぁぁ?馬鹿な!UTF-8な今の状況はどーすりゃ良いんだ!ソースはUTF-8、内部はUNICODE(?)、表示はMS932にしろってことか!んな鬼みたいな環境やってられるか。
こりゃ本格的にコンソールをどうにかするか、コンパイラをMS製かBorland C++にするか考えないと駄目か〜


ちなみに、なぜかリダイレクトしたファイルの中は、正常に出力されて文字もUTF-8が使われていました。謎

>a > OUT.txt
>type OUT.txt
Japanese_Japan.932
ファイル構成