
ここではATLに備わるファイル操作用のクラス「CAtlFile」を利用してUTF-8形式のテキストファイルを読み込み、メッセージボックスに表示した。
UTF-8からユニコードへの変換にはMultiByteToWideCharを利用する。
#include <atlfile.h>
//
// UTF8文字列を普通のユニコード文字列に変換する
//
//CP_UTF8はWindows98では利用できない?
//
WCHAR* ConvertUTF8ToUnicode(const char* pszUTF8)
{
int nLen;
WCHAR* pszWchar;
//Unicodeに必要な文字数の取得
nLen = ::MultiByteToWideChar(CP_UTF8,0,pszUTF8,-1,NULL,0);
pszWchar = new WCHAR[nLen];
if(pszWchar == NULL)
return NULL;
//変換
nLen = ::MultiByteToWideChar(CP_UTF8,0,pszUTF8,(int)::strlen(pszUTF8)+1,pszWchar,nLen);
if(nLen)
return pszWchar;
delete pszWchar;
return NULL;
}
bool Test()
{
bool ret;
HRESULT hr;
ULONGLONG nLen;
CAtlFile cFile;
//ファイルを読み込みモードで開く
hr = cFile.Create(_T("テスト.txt"),GENERIC_READ,FILE_SHARE_READ,OPEN_EXISTING);
if(FAILED(hr))
return false; //ファイルを開くのに失敗
//ファイルサイズを取得
hr = cFile.GetSize(nLen);
ret = false;
if(SUCCEEDED(hr))
{
char* pszBuff;
pszBuff = new char[(size_t)nLen + 1];
if(pszBuff)
{
//ファイルにはNULL文字がないので付加しておく
pszBuff[nLen] = NULL;
//ファイルを読み込む
hr = cFile.Read(pszBuff,(DWORD)nLen);
//読み込んだ内容をメッセージボックスで表示
if(SUCCEEDED(hr))
{
WCHAR* pwszBuff;
//UTF8をUnicodeに変換
pwszBuff = ConvertUTF8ToUnicode(pszBuff);
if(pwszBuff)
{
//このメッセージボックス関数は基本的にWindows 9xでは使えないので注意!
::MessageBoxW(NULL,pwszBuff,L"",MB_OK);
ret = true;
delete pwszBuff;
}
}
delete pszBuff;
}
}
//ファイルを閉じる
cFile.Close();
return ret;
}
