1. 程式人生 > >CString型別轉換,字串操作和UNICODE、ANSI字符集

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