ウィリアムのいたずらの、まちあるき、たべあるき

ウィリアムのいたずらが、街歩き、食べ物、音楽等の個人的見解を主に書くブログです(たま~にコンピューター関係も)

VC++で、UTF-8からSJISに変換する。

2007-08-15 16:39:31 | Weblog

そんなの簡単ジャン!
MultiByteToWideCharで、UTF-8からUTF16にして
WideCharToMultiByteで、UTF-16からSJISにすればいいだけじゃん。
終了。。

って言う人が多いかとは思うけど、

暗記力の悪いウィリアムのいたずら、
MultiByteToWideCharの引数ってなんだったっけ?
バッファの大きさもとめるのに、0いれるんだっけ(^^;)
と、なってしまうので、

自分へのメモということで、かいてみました。

こんなかんじ
unsigned char	*MyUtil::utf8ToSjis(char *utf8)
{
	wchar_t* utf16 = NULL;

	if ( utf8	==	NULL )
		return	NULL;

	//==============================//
	//	UTF8=>UTF16変換	    //
	//==============================//
	//	まずは、wlenの長さをとる
    	const int wlen = MultiByteToWideChar(CP_UTF8, 0, utf8, -1, NULL, 0);
    	if (!wlen)
	{
		return NULL;
	}

	//	utf16の領域確保
	utf16 = new wchar_t[wlen + 1];
	if ( utf16	==	NULL )
	{
		return NULL;
	}

	//	utf16変換
	if ( MultiByteToWideChar(CP_UTF8, 0, utf8, -1, utf16, wlen) > 0 )
	{
        utf16[wlen] = L'¥0';
	}
	else
	{
		delete utf16;
		return NULL;
	}


	//==============================//
	//	UTF16=>ShiftJIS変換   //
	//==============================//
	//	まずは、長さを取得
	const int mlen = WideCharToMultiByte(CP_ACP,0,utf16,-1,NULL,0," ",NULL);
	if (!mlen)
	{
		delete utf16;
		return NULL;
	}

	//	領域確保
	unsigned char	*sjis = new unsigned char[mlen + 1];
	if ( sjis	==	NULL )
	{
		delete utf16;
		return NULL;
	}

	//	utf16変換
	if ( WideCharToMultiByte(CP_ACP,0,utf16,-1,(LPSTR)sjis,mlen," ",NULL) > 0 )
	{
	        sjis[mlen] = 0;
	}
	else
	{
		delete	utf16;
		delete	sjis;
		return NULL;
	}

	//	あとしまつ
	delete utf16;

	return sjis;
}

(上記< > ¥ は本当は半角です)

MyUtilクラスに、はいるってことにしてます。
引数がutf-8文字列、返り値がNULLだと問題あり、
それ以外の場合はSJIS変換文字列です。
変換文字列が帰ってきた場合、メモリの解放(free)は、呼び出し側でやってくださいね。



この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« サーブレット部分をパターン... | トップ | VC++でのファイルの一気読み... »
最新の画像もっと見る

Weblog」カテゴリの最新記事