ENGLISH page is here.
GET DinopSearchBar
サイト内検索:
HOME
VC++ TIPS
ダウンロード
DinopExifReader
DinopSearchBar
DinopSearchBar mini
DinopTabbingBar
for Firefox
大阪湾の生き物
甲子園浜の自然
甲子園浜の干潟
甲子園浜の水中
甲子園浜の野鳥
近畿の山々
植物図鑑
箕面マップ
水中機材
カメラ
ランキング
望遠鏡の世界
顕微鏡の世界
Googleのすべて
GoogleマップAPI
ニュース
読んだ本
日記
変な料理の作り方
遺伝子操作
論文紹介
デイトレード
自動売買でFX
ネットで小遣い稼ぎ
Solaris
電子工作
その他
問い合わせ
VC++用コード集
大阪湾の生き物
水中用機材
since:2000/11/15
dinopcom@gmail.com
www.dinop.comは
だいのっぷ・どっと・こむ
と読んでください。







« ユニコードからUTF8への変換 | メイン | フォントの指定(CreateFontIndirect) »

UTF8からユニコードへの変換




解説

 Internet Explorer系のコンポーネントであるIMultiLanguage2を利用すると 様々なコードページ間で文字列の変換ができる。ここではUTF8からユニコード へ変換する方法について紹介する。


使用例


	char		psz[256];
	WCHAR		pwsz[256];
	CStringW	ustr;

	//テスト用にUTF8文字列を作成
	//関数の実装は「ユニコードからUTF8への変換」を参照のこと。
	UnicodeToUTF8(L"あいうえお",psz,256);

	UTF8ToUnicode(psz,ustr);
	UTF8ToUnicode(psz,pwsz,256);

	//pwszやustrが変換されたユニコード文字列



ソースコード


//
//	UTF8文字列からユニコード文字列に変換
//
bool	UTF8ToUnicode(LPSTR pszUtf8,CStringW& ustrUnicode)
{
	HRESULT	hr;
	DWORD	dwMode;
	UINT	nDstLen;
	UINT	nSrcLen;

	CComPtr		pMultiLanguage;

	::CoCreateInstance(CLSID_CMultiLanguage,NULL,CLSCTX_ALL,IID_IMultiLanguage2,(void**)&pMultiLanguage);
	if(pMultiLanguage == NULL)
	{
		ATLASSERT(0);		//::CoInitialize(NULL);が実行されていない!
		return	false;
	}

	nSrcLen = (strlen(pszUtf8) + 1) * sizeof(char);
	dwMode	= 0;
	nDstLen	= 0;
	hr = pMultiLanguage->ConvertString(&dwMode,65001,1200,(BYTE*)pszUtf8,&nSrcLen,NULL,&nDstLen);	//バッファサイズ取得
	if(FAILED(hr))
		return	false;

	ustrUnicode.GetBufferSetLength(nDstLen);
	hr = pMultiLanguage->ConvertString(&dwMode,65001,1200,(BYTE*)pszUtf8,&nSrcLen,(BYTE*)ustrUnicode.GetBuffer(nDstLen),&nDstLen);	//変換
	if(FAILED(hr))
	{
		ustrUnicode = L"";
		return	false;
	}

	return	true;
}



//
//	UTF8文字列からユニコード文字列に変換
//
//	nUnicodeLengthは文字数で指定(バイト数ではない!)
//
bool	UTF8ToUnicode(LPSTR pszUtf8,LPWSTR pwszUnicode,UINT nUnicodeLength)
{
	HRESULT	hr;
	DWORD	dwMode;
	UINT	nDstLen;
	UINT	nSrcLen;

	CComPtr		pMultiLanguage;

	if(pwszUnicode && nUnicodeLength)
		*pwszUnicode = NULL;
	else
		return	false;

	::CoCreateInstance(CLSID_CMultiLanguage,NULL,CLSCTX_ALL,IID_IMultiLanguage2,(void**)&pMultiLanguage);
	if(pMultiLanguage == NULL)
	{
		ATLASSERT(0);		//::CoInitialize(NULL);が実行されていない!
		return	false;
	}

	nUnicodeLength *= sizeof(WCHAR);
	nSrcLen = (strlen(pszUtf8) + 1) * sizeof(char);
	dwMode	= 0;
	nDstLen	= 0;
	hr = pMultiLanguage->ConvertString(&dwMode,65001,1200,(BYTE*)pszUtf8,&nSrcLen,NULL,&nDstLen);	//バッファサイズ取得
	if(FAILED(hr) || (nDstLen > nUnicodeLength))
		return	false;

	hr = pMultiLanguage->ConvertString(&dwMode,65001,1200,(BYTE*)pszUtf8,&nSrcLen,(BYTE*)pwszUnicode,&nUnicodeLength);	//変換
	if(FAILED(hr))
		return	false;

	return	true;
}








Copyright (c) 1999-2007 issei. All rights reserved. (運営者情報