printfで日本語文字が出力されない!?

 C++のテストプログラムを組もうと、で久しぶりにC言語によるコンソールプログラムを作成したのだが、謎のトラブルに見舞われてしまった。
printf1.c
int _tmain(int argc, _TCHAR* argv[])
{
    _tprintf(_T("TNK Softwareはユニークなオンラインソフトを提供します。\n"));
    _tprintf(_T("TNK Software Blogはユニークな情報やネタを提供します。\n"));

    getchar(); // Enterキーの入力を待つ
    return 0;
}
 このように、単純に文字列を出力するプログラム(_tmain、_tprintfは、それぞれmain、printfのUnicode/マルチバイトに両対応するため関数)を実行すると、アルファベット以降が全く出力されないのである。

 この問題をいろいろ調べてみたところ、最新のVisual C++でコンパイルされたコンソールプログラムは、内部の標準文字列が、初期状態ではANSI Cに限定されているため、日本語などの文字コードが256を超える文字はすべて無視されてしまうことがわかった。これを解決するには、プログラムの先頭で、取り扱う文字列の変更を宣言するとよい。

printf2.c
#include <locale.h> // setlocaseを利用するためのヘッダ

int _tmain(int argc, _TCHAR* argv[])
{
    // [_tsetlocale]は[setlocale]のUnicode/マルチバイト両対応関数
    // 第2引数の空文字はシステム規定の文字コードの指定を意味する
    _tsetlocale(LC_ALL, _T(""));

    _tprintf(_T("TNK Softwareはユニークなオンラインソフトを提供します。\n"));
    _tprintf(_T("TNK Software Blogはユニークな情報やネタを提供します。\n"));

    getchar();  // Enterキーの入力を待つ
    return 0;
}
 これで、日本語をあつかったコンソールプログラムも問題なく動作するようになる。
2008/02/19