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