WindowsプログラミングでのWCHARの扱い方

WCHARでは代入などの際に " " ではなく、L" " を利用していることに注意。

変数の宣言時に文字列を指定することもできる。
////////////////////////////////
//初期文字列代入
//
WCHAR	pszSrc[] = {L"abcdあいう"};
文字数取得にstrlen(char型専用)は利用できない。wcslenを利用する。
////////////////////////////////
//文字数取得
//
size_t	nLen1 = ::wcslen(pszSrc);		//変数内の文字列の文字数取得
size_t	nLen2 = ::wcslen(L"あいうえ");	//指定した文字列の文字数取得
文字列の代入にstrlenは利用できない。wcscpyをより安全にしたwcscpy_sを利用する。
////////////////////////////////
//文字列代入
//
WCHAR	pszText[256];
::wcscpy_s(pszText,256 * sizeof(WCHAR),L"あいうえABCD");	//直接代入
::wcscpy_s(pszText,256 * sizeof(WCHAR),pszSrc);				//変数から代入
この変換時、プロジェクトの設定が非ユニコード(MBCSなど)になっているときは正常に変換できない可能性があるので注意。例えばWCHAR*型にハングル文字と日本語などが混在している場合が挙げられる。
////////////////////////////////
//WCHAR*からCStringへの変換
//
CString	strText(pszText);
この場合も変換ができないことがあるので注意。
////////////////////////////////
//WCHAR*からCStringA(char型のCString)への変換
//
CStringA	strTextA(pszText);			//コンストラクタを利用
常にWCHAR*型のCStringWへの変換時はユニコード同士の変換なので文字列が正常にコピーできないことはない。
////////////////////////////////
//WCHAR*からCStringW(WCHAR型のCString)への変換
//
CStringW	strTextW1(pszText);			//コンストラクタを利用
CStringW	strTextW2 = pszText;		//代入
CStringAへの変換と内容は同じだが実装量が増える。この場合も変換できない可能性があるので注意が必要だ。
////////////////////////////////
//WCHAR*からchar*へ変換
//
WCHAR	pszWchar[] = {L"abcdあいう"};
char*	pszChar;
{
	int		nLen;

	//charに必要な文字数の取得
	nLen = ::WideCharToMultiByte(CP_THREAD_ACP,0,pszWchar,-1,NULL,0,NULL,NULL);
	pszChar = new char[nLen];
	if(pszChar)
	{
		//変換
		nLen = ::WideCharToMultiByte(CP_THREAD_ACP,0,pszWchar,(int)::wcslen(pszWchar)+1,pszChar,nLen,NULL,NULL);
		if(nLen == 0)
		{
			delete	pszChar;
			pszChar = NULL;
		}
	}
}
//
//ここでchar*型のpszCharを任意の処理で利用
//
delete	pszChar;		//処理が終わったらdelete

カテゴリー「文字列操作」 のエントリー