MFC常用字符編碼轉換

MFC中幾種字符串的理解

CStringT

CStringT爲模板類,CString、CStringA、CStringW爲其三種具體實現;

CStringA

該類在系統中定義爲:
typedef ATL::CStringT< char, StrTraitMFC_DLL< char > > CStringA;
即該類型字符串中的字符實際上爲==char==類型,用1個字節表示;

CStringW

該類型在系統中的定義爲:
typedef ATL::CStringT< wchar_t, StrTraitMFC_DLL< wchar_t > > CStringW;
該類型字符串中的字符類型爲==wchar_t==類型,稱爲寬字符類型,在不同環境中,寬字符類型具體長度不同,在MSVS中該類型用2個字節表示;

CString

該類型在系統中的定義爲:
typedef ATL::CStringT< TCHAR, StrTraitMFC_DLL< TCHAR > > CString;
其中字符的類型爲==TCHAR==,而TCHAR在系統中的定義爲:

#ifdef  UNICODE     
typedef wchar_t TCHAR;  
#else   
typedef char TCHAR; 

由上述代碼可以看出,當編碼方式爲UNICODE的時候,CString與CStringW一樣;否則,CString與CStringA一樣;
即CString中字符具體表示方式取決於當前環境的編碼方式;

字符串之間的轉換


從wchar_t轉換成char*
    CStringW srcstrW;
    int dBufSize = WideCharToMultiByte(CP_OEMCP, 0, srcstrW, -1, NULL, 0, NULL, FALSE);
    char *pBuf = new char[dBufSize + 1];
    memset(pBuf, 0, dBufSize + 1);
    WideCharToMultiByte(CP_OEMCP, 0, srcstrW, -1, pBuf, dBufSize, NULL, FALSE);
    //pBuf爲轉換後的字符串指針

封裝成函數:

/*  
函數名稱:CStringW2char
函數說明:將CStringW字符串轉換成char類型的指針
參數說明:CStringW類型的字符串
返回值:char類型指針
注意:使用後需釋放內存;
*/      
char* CStringW2char(CString srcstrW)    
{   
    int dBufSize = WideCharToMultiByte(CP_OEMCP, 0, srcstrW, -1, NULL, 0, NULL, FALSE);
    char *pBuf = new char[dBufSize + 1];
    memset(pBuf, 0, dBufSize + 1);
    WideCharToMultiByte(CP_OEMCP, 0, srcstrW, -1, pBuf, dBufSize, NULL, FALSE);
    pBuf[dBufSize] = '\0';
    return pBuf;
}

由於char*與string之間的轉換較爲直接,爲了避免內存分配釋放問題,可將其封裝爲CStringW轉換到string的函數;

/*
函數名稱:CStringW2string
函數說明:將CStringW字符串轉換成string字符串
參數說明:CStringW類型的字符串
返回值:string類型的字符串;
*/  
string CStringW2string(CString srcstrW)
{
    int dBufSize = WideCharToMultiByte(CP_OEMCP, 0, srcstrW, -1, NULL, 0, NULL, FALSE);
    char *pBuf = new char[dBufSize + 1];
    memset(pBuf, 0, dBufSize + 1);
    WideCharToMultiByte(CP_OEMCP, 0, srcstrW, -1, pBuf, dBufSize, NULL, FALSE);
    pBuf[dBufSize] = '\0';
    string tmpstr = pBuf;
    delete pBuf;
    pBuf = NULL;
    return tmpstr;
}

從char*轉換成wchar_t
    char srcstr[str_len];
    int dBufSize = MultiByteToWideChar(CP_UTF8, 0, srcstr, -1, NULL, 0);
    WCHAR *pBuf = new WCHAR[dBufSize + 1];
    memset(pBuf, 0, dBufSize + 1);
    MultiByteToWideChar(CP_UTF8, 0, srcstr, -1, pBuf, dBufSize);
    //pBuf爲轉換後的字符串指針

封裝成函數

/*
函數名稱:char2wchar
函數說明:將char*類型指針轉換成WCHAR*類型的指針;
參數說明:char*類型的指針
返回值:WCHAR*類型的指針
注意:使用後需釋放內存,作爲參數傳入的指針未釋放;
*/
WCHAR* char2wchar(char *pstr)
{
    int dBufSize = MultiByteToWideChar(CP_UTF8, 0, pstr, -1, NULL, 0);
    WCHAR *pBuf = new WCHAR[dBufSize + 1];
    memset(pBuf, 0, dBufSize + 1);
    MultiByteToWideChar(CP_UTF8, 0, pstr, -1, pBuf, dBufSize);
    pBuf[dBufSize] = '\0';
    return pBuf;
}

同樣的,可以將由char*指針指向的字符串轉換成CStringW類型的字符串

/*
函數名稱:char2CStringW
函數說明:將char*類型指針轉換成CStringW字符串,
參數說明:char*類型的指針
返回值:CStringW類型的字符串
注意:作爲參數傳入的指針未釋放;
*/
CStringW char2CStringW(char *pstr)
{
    int dBufSize = MultiByteToWideChar(CP_UTF8, 0, pstr, -1, NULL, 0);
    WCHAR *pBuf = new WCHAR[dBufSize + 1];
    memset(pBuf, 0, dBufSize + 1);
    MultiByteToWideChar(CP_UTF8, 0, pstr, -1, pBuf, dBufSize);
    pBuf[dBufSize] = '\0';
    CStringW tmpstrW = pBuf;
    delete pBuf;
    return tmpstrW;
}   

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章