CString型別轉換,字串操作和UNICODE、ANSI字符集
一.CString與LPCWSTR
兩者的不同:LPCWSTR 是Unicode字串指標,初始化時串有多大,申請空間就有多大,以後存貯若超過則出現無法預料的結果,這是它與CString的不同之處。而CString是一個串類,記憶體空間類會自動管理。
CString轉換成LPCWSTR
方法一:CString strFileName;
LPCWSTR lpcwStr = strFileName.AllocSysString();
方法二:CString str=_T("TestStr");
USES_CONVERSION;
LPCWSTR lpcwStr = A2CW((LPCSTR)str);
MFC中CString和LPSTR是可以通用,其中A2CW表示(LPCSTR) -> (LPCWSTR),USER_CONVERSION表示用來定義一些中間變數,在使用ATL的轉換巨集之前必須定義該語句。
LPCWSTR轉換成CString
LPCWSTR lpcwStr = L"TestWStr";
CString str(lpcwStr);
二.CString與LPSTR轉換
CString轉換成LPSTR:
方法一:CString strFileName;
LPSTR lpStr = strFileName.GetBuffer();
strFileName.ReleaseBuffer();
方法二:CString strFileName;
LPSTR lpStr = (LPSTR)(LPCSTR)strFimeName;
LPSTR轉換成CString:
LPSTR lpStr = L"TestStr";
CString str(lpStr);
注意:CString和LPCSTR可直接轉換,如下:
CString str;
LPCSTR lpcStr = (LPCSTR)str;
三.CString和char*轉換
CString轉換成char*
方法一:CString str;
char* p = str.GetBuffer();
方法二:CString str;
char* p = (LPSTR)(LPCSTR)str;
char*轉換成CString
char* p = "test";
CString str = ("%s",p);
四.String和int、float的轉換
可以使用atoi,atof,atol等函式來完成。
五.LPSTR(char*)和LPWSTR的轉換
可以使用下面的ATL巨集來進行,最好是將變數定義成TCHAR、LPTSTR等T型別,可以避免轉換。
ATL巨集介紹:
A2BSTR OLE2A T2A W2A
A2COLE OLE2BSTR T2BSTR W2BSTR
A2CT OLE2CA T2CA W2CA
A2CW OLE2CT T2COLE W2COLE
A2OLE OLE2CW T2CW W2CT
A2T OLE2T T2OLE W2OLE
A2W OLE2W T2W W2T
A :ANSI 字串,也就是 MBCS。
W、OLE 寬字串,也就是 UNICODE。
T 中間型別T。如果定義了 _UNICODE,則T表示W;如果定義了 _MBCS,則T表示A
C const 的縮寫
利用這些巨集,可以快速的進行各種字元間的轉換。使用前必須包含標頭檔案,並且申明USER_CONVERSION;使用 ATL 轉換巨集,由於不用釋放臨時空間,所以使用起來非常方便。但是考慮到棧空間的尺寸(VC 預設2M),使用時要注意幾點:
1、只適合於進行短字串的轉換;
2、不要試圖在一個次數比較多的迴圈體內進行轉換;
3、不要試圖對字元型檔案內容進行轉換,因為檔案尺寸一般情況下是比較大的;
4、對情況 2 和 3,要使用 MultiByteToWideChar() 和 WideCharToMultiByte();
void Func1(LPSTR lpStr);
void Func2(LPWSTR lpwStr);
TCHAR name[256];
TCHAR* pName = new TCHAR[256];
Func1(name); // Func1(pName);
Func2(name); // Func2(pName);
注意在VS2005中上面用紅色標記的程式碼已經不成立。
VS2005中CString已經改為寬字元型,一些轉換如下:
char name[10];
TCHAR sex[5] ;
char *p = name;
TCHAR *pw = sex;
LPSTR lpstr = name;
LPCSTR lpcstr = name;
lpcstr = lpstr;
lpstr = p;
p = (char*)sex;
pw = (WCHAR*)name;
LPWSTR lpwstr = (LPWSTR)lpstr;
lpwstr = (LPWSTR)lpcstr;
LPCWSTR lpcwstr = (LPCWSTR)lpstr;
lpcwstr = (LPCWSTR)name;
CString str(lpstr);
CString str1(lpcstr);
CString str2(lpwstr);
CString str3(lpcwstr);
CString str4(name);
CString str5(sex);
lpwstr = (LPWSTR)(LPCWSTR)str;
lpstr = (LPSTR)(LPCWSTR)str;
lpcstr = (LPCSTR)(LPCWSTR)str;
p = (char*)str.GetBuffer();
pw = str.GetBuffer();
可以看出轉換更加簡單了,基本上可以直接轉換,A2W等巨集基本上不需要啦
五、 有關相關字串操作
字符集特性:
ANSI 操作函式以str開頭 strcpy
Unicode 操作函式以wcs開頭 wcscpy
MBCS 操作函式以_mbs開頭 _mbscpy
ANSI/Unicode 操作函式以_tcs開頭 _tcscpy(C執行期庫)
ANSI/Unicode 操作函式以lstr開頭 lstrcpy(Windows函式)
所有新的和未過時的函式在Windows2000中都同時擁有ANSI和Unicode兩個版本。ANSI版本函式結尾以A表示;Unicode版本函式結尾以W表示。Windows會如下定義:
#ifdef UNICODE
#define CreateWindowEx CreateWindowExW
#else
#define CreateWindowEx CreateWindowExA
#endif // !UNICODE