ユニコード環境での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は配列しか受け取れないし。