ユニコード環境でのCStringその他(書きかけです)


ダイアログの見栄えが良いという理由で始めたユニコード環境でのMFCアプリケーション。今はちょっと後悔しております。見てくれにほいほいついて行くもんじゃないですな。


というのも、素人にはwchar_t型の処理が面倒すぎる。。。特にヘビーユーズするOpenCVは全てchar型でファイルやらを突っ込むので毎回エラーを出すと。

そこで今回のメモは変換のしかた。その他いろいろ

CString → char* (unicodeの時のみ!)


良く使うので関数にしてみた。第2引数のCStringの中身が第1引数のchar*にコピーされる。(関数名はConvertと言っているが、別に元をクリアするわけじゃない。cpyのほうが正しい気がする…)


void ConvertCS2CHAR(char pchStr[], CString csStr)
{
	// CString → TCHAR*
	TCHAR	*ptcStr = new TCHAR[csStr.GetLength()+1]; 
	_tcscpy(ptcStr, csStr);

	// TCHAR → char*
	size_t wLen = 0;
	errno_t err = 0;

	// ロケール指定
	setlocale(LC_ALL, "japanese");
	
	err = wcstombs_s(&wLen, pchStr, BUFSIZ, ptcStr, _TRUNCATE);

        delete ptcStr;
}


途中TCHARに一旦変換してるけど、unicode下なのでwchar_t型と同じ。(ちなみにunicodeでなければTCHARはchar型にタイプデフされるはず。TはtempのT?)
最初はこの辺がよくわからんかったんだが、まずunicodeではCStringはwchar_t型で文字列を奥のほうに格納している。なのでそのwchar_tをまず_tcscpy()で引きずり出し、得られたwchar_tをwcstombs_s()でcharに直しているというもの。


以下を参考に。色々まとまっていて感動しました。
http://note.phyllo.net/?eid=1106043


ただこの関数、早速不具合が。。あんまり調べずにwcstombs_sの第3引数設定したら、渡したcharの要素数が小さい場合挙動が保障されない!
…〆切も近いので放置する。ただ改良は今度必ず。現状charは配列しか受け取れないし。