開発環境 Microsoft Visual C++ 2010 Express (SP1)
実行環境 Microsoft Windows XP Home Edition (SP3)
プロジェクトの種類 Win32 コンソール アプリケーション
プロジェクト名 test
アプリケーションの種類 コンソール アプリケーション
追加のオプション 空のプロジェクト


test1.c
#include <stdio.h>
void main()
{
	wchar_t	awcStr[] = L"ABCあいう\n";
 
	wprintf(L"%s", awcStr);
}
 
出力
ABC???
考察
改行まで出力されるが、あいうが?(0x3F)に変換される


test2.c
#include <locale.h>
#include <stdio.h>
void main()
{
	wchar_t	awcStr[] = L"ABCあいう\n";
	char*	pcLocale;
 
	pcLocale = setlocale(LC_CTYPE, "");
	printf("pcLocale=[%s]\n", pcLocale);
	wprintf(L"%s", awcStr);
}
 
出力
pcLocale=[Japanese_Japan.932]
ABCあいう
考察
CodePage932(Shift_JIS)に変換されて全て出力される


test3.c
#include <locale.h>
#include <stdio.h>
void main()
{
	wchar_t	awcStr[] = L"ABCあいう\u2665\n";
	char*	pcLocale;
 
	pcLocale = setlocale(LC_CTYPE, "");
	printf("pcLocale=[%s]\n", pcLocale);
	wprintf(L"%s", awcStr);
}
 
出力
pcLocale=[Japanese_Japan.932]
ABCあいう?
考察
printf系出力はロケールに依存する
変換できない文字は?(0x3F)に変換される


test4.c
#include <stdio.h>
void main()
{
	wchar_t	awcStr[] = L"ABCあいう\u2665\n";
	FILE*	pFile;
 
	fopen_s(&pFile, "a.txt", "wt,ccs=UNICODE");
	fwprintf(pFile, L"%s", awcStr);
	fclose(pFile);
}
 
出力
ABCあいう♥
考察
ファイル出力に関してはこれで問題ない


test5.c
#include <stdio.h>
void main()
{
	wchar_t	awcStr[] = L"ABCあいう\u2665\n";
	FILE*	pFile;
 
	fopen_s(&pFile, "con", "wt,ccs=UNICODE");
	fwprintf(pFile, L"%s", awcStr);
	fclose(pFile);
}
 
出力
  B C B0D0F0e&
考察
標準出力をファイルにリダイレクトしても0バイトのファイルが作成されるだけで
コンソールに出力される
ccsにUTF-8、UTF-16LEを指定しても文字化けする


test6.c
#include <Windows.h>
void main()
{
	wchar_t	awcStr[] = L"ABCあいう\u2665\n";
	HANDLE	hConOut;
	DWORD	dwWritten;
 
	hConOut = GetStdHandle(STD_OUTPUT_HANDLE);
	WriteConsoleW(hConOut, awcStr, wcslen(awcStr), &dwWritten, NULL);
}
 
出力
ABCあいう♥
考察
標準出力をファイルにリダイレクトしても0バイトのファイルが作成されるだけで
コンソールにも出力されない


test7.c
#include <fcntl.h>	// _O_WTEXT
#include <io.h>		// _setmode
#include <stdio.h>	// _fileno
void main()
{
	wchar_t	awcStr[] = L"ABCあいう\u2665\n";
 
	_setmode(_fileno(stdout), _O_WTEXT);
	wprintf(L"%s", awcStr);
}
 
出力
ABCあいう♥
考察
標準出力をファイルにリダイレクト可能
_O_WTEXT BOMなしUTF-16LE
_O_U16TEXT BOMなしUTF-16LE
_O_U8TEXT BOMなしUTF-8(UTF-8N)
最終更新:2012年09月01日 16:43