MFCでの各種文字列タイプと相互変換
10282 ワード
MFCにおける共通文字列データ型表現の意味:
L:Long長P:PointポインタC:Const定数W:Wchar_tワイド文字T:TCHAR STR:String文字列
MFCの下で各種のデータ型の定義を見ます:
1 typedef char *LPSTR;
2 typedef const char *LPCSTR;
3
4 typedef wchar_t *LPWSTR;
5 typedef const wchar_t *LPCWSTR;
6 typedef wchar_t WCHAR;
7
8 #ifdef UNICODE
9 typedef LPCWSTR LPCTSTR;
10 typedef WCHAR TCHAR;
11
12 #else
13 typedef LPCSTR LPCTSTR;
14 typedef char TCHAR;
MFCで提供されるATL変換マクロ:
T2A T2W T2CA T2CW W2A W2CA W2T W2CT A2W A2CW A2T A2CT
T:TCHAR 2:To C:CONST A:CHAR(ANSI) W:WCHAR
先にatlconv.hヘッダファイルの下でこれらのマクロの定義を見てみましょう.
1.USES_CONVERSION:注意int_convert; (_convert);この使い方は、コンパイラの警告:参照されていないローカル変数をブロックするためです.の
#ifndef _DEBUG
#define USES_CONVERSION int _convert; (_convert); UINT _acp = ATL::_AtlGetConversionACP() /*CP_THREAD_ACP*/; (_acp); LPCWSTR _lpw; (_lpw); LPCSTR _lpa; (_lpa)
#else
#define USES_CONVERSION int _convert = 0; (_convert); UINT _acp = ATL::_AtlGetConversionACP() /*CP_THREAD_ACP*/; (_acp); LPCWSTR _lpw = NULL; (_lpw); LPCSTR _lpa = NULL; (_lpa)
#endif
USES_CONVERSIONマクロは、_のような変換に必要な変数を定義します.convert.そのため、それらのマクロを使用するときは、そのマクロを追加する必要があります.
2.A 2 W:ここでUSESを使いましたCONVERSIONマクロ定義の_convert変数
1 #define A2W(lpa) (\
2 ((_lpa = lpa) == NULL) ? NULL : (\
3 _convert = (lstrlenA(_lpa)+1),\
4 (INT_MAX/2<_convert)? NULL : \
5 ATLA2WHELPER((LPWSTR) alloca(_convert*sizeof(WCHAR)), _lpa, _convert, _acp)))
3.ATLA2WHELPER
1 #define ATLA2WHELPER AtlA2WHelper
4.AtlA 2 WHElper:マルチバイトからワイドバイトへの変換という、実際にはMultiByteToWideCharが呼び出されています
1 _Ret_opt_z_cap_(nChars) inline LPWSTR WINAPI AtlA2WHelper(_Out_z_cap_(nChars) LPWSTR lpw, _In_z_ LPCSTR lpa, _In_ int nChars, _In_ UINT acp) throw()
2 {
3 ATLASSERT(lpa != NULL);
4 ATLASSERT(lpw != NULL);
5 if (lpw == NULL || lpa == NULL)
6 return NULL;
7 *lpw = '\0';
8 int ret = MultiByteToWideChar(acp, 0, lpa, -1, lpw, nChars);
9 if(ret == 0)
10 {
11 ATLASSERT(FALSE);
12 return NULL;
13 }
14 return lpw;
15 }
5.alloca
#define alloca _alloca
6._alloca:この関数はスタックからバイト単位のメモリを割り当て、void*を返します.
1 void *_alloca(
2 size_t size
3 );
使用方法の例:
1 USES_CONVERSION;//USES_CONVERSION ATL , ,
2
3 WCHAR *pWch = L"WCHAR* TO CHAR*";
4 CHAR *pCh = W2A(pWch);
5
6 TCHAR *pTch = _T("TCHAR* TO CHAR*");
7 CHAR *pCh2 = T2A(pTch);
USESの使用CONVERSIONは、呼び出した関数が戻るまでスタックからメモリを割り当て、メモリが解放されないことに注意してください.1サイクルでこのマクロが数万回繰り返し呼び出されると、stackoverflowが発生することは避けられない.
しかしスタック空間のサイズを考慮すると(デフォルト2 M)使用時に注意すべき点:1、短い文字列の変換にのみ適していること、2、1回のサイクル内で変換しようとしないこと、3、文字型ファイルの内容を変換しようとしないこと、ファイルサイズが一般的に大きいこと、4、ケース2と3、MultiByteToWideChar()WideCharToMultiByte()と;
参照http://www.cnblogs.com/wind-net/archive/2012/10/31/2718329.html
5、文字変換を関数にカプセル化する
1 void DoA2W()
2 {
3 USES_CONVERSION;
4 DoSomething(A2W("SomeString"));
5 }
その他、C言語
1 char * pstr = "abc";
2
3 size_t nLen = _mbstrlen(pstr) + 1;
4 // mbstowcs(NULL, pstr, 0);,
5
6 wchar_t * pwstr = new wchar_t[nLen];
7 mbstowcs(pwstr, pstr, nLen);//multibyte string to widechar string
8
9 size_t nwLen = wcslen(pwstr) + 1;//wcstombs(NULL, pwstr, 0)
10 char *pstr2 = new char[nwLen];
11 wcstombs(pstr2, pwstr, nwLen);//widechar string to multibyte string
12
13 delete []pwstr;
14 pwstr = NULL;
15
16 delete []pstr2;
17 pstr2 = NULL;