ASCII是1 byte編碼, 只能記錄256種字元
Unicode為一種4 byte編碼, 全世界各語系的字元或符號, 都賦予一個固定的編碼

c++裡的Unicode字元表示法為wchar_t, 然而不同的作業系統對這個Unicode字元的大小設定

都不太相同. 標準的Unicode字元是4 byte, 有些作業系統直接便支援4 byte Unicode, 也就是

wchar_t大小是4 byte.不過Windows支援的Unicode字元是2 byte, 主要的考量點是因為(最

高2 byte非0)的字甚為罕用,若採用4 byte來記錄, 那麼1份英文文件的大小便會加大成為4倍.
有些Unix作業系統則將wchar_t定為1 byte, 以UTF-8做為編碼基礎.

WCHAR是Windows自行定義的資料形態, 表示的便是2 byte Unicode字元.        Ex:WCHAR* s = L"test"

char    :ANSI(ASCII);     使用strXXX的函數,EX:strcpy ;        CHAR==char
         Ex: char szString[100];
              strcpy(szString,"test");    


wchar_t    :Unicode, in <string.h>; 使用wcsXXX的函數,Ex:wcscpy,
         在Unicode字串前加L(將字串轉成Unicode), Ex:L"This is Unicode String"
        
         Ex: wchar_t szString[100];
               wcscpy(szString,L"test");

TCHAR    :For Unicode and ANSI together,<TChar.h>
         依據是否定義_UNICODE而決定是 char or WCHAR    
          使用_tcsXXX的函數,EX: _tcscpy
         Ex:
             TCHAR* s = _T"test";
             or
              TCHAR szString[100];
              _tcscpy(szString,_TEXT("test"));
              [  _T==_TEXT  ]

CString     :對應TCHAR. MFC裡處理字串用的物件.

                 處理ASCII字串, 還是處理Unicode字串, 便取決於是否有定義"UNICODE"      
CStringA :對應ANSI
CStringW :對應wchar_t

LPSTR = char *
LPCSTR = const char *
LPWSTR = wchar_t *
LPCWSTR = const wchar_t *
LPOLESTR = OLECHAR * = BSTR = LPWSTR(Win32)
LPCOLESTR = const OLECHAR * = LPCWSTR(Win32)

LPTSTR = _TCHAR *
LPCTSTR = const _TCHAR *

#ifdef UNICODE
    typedef LPWSTR LPTSTR;
    typedef LPCWSTR LPCTSTR;
#else
    typedef LPSTR LPTSTR;
    typedef LPCSTR LPCTSTR;
#endif

//========================================================//
1. CString -> Char *
    CString str="I amd good";
    char *lp=str.GetBuffer(str.GetLength());
    str.ReleaseBuffer();
    
    or 強制轉換方式
    CString theString( "This is a test" );
    LPTSTR lpsz =(LPTSTR)(LPCTSTR)theString;  
    
2. char* -> CString
    CString str;
    char pStr[100];
    char * p = "This is a test";
    str.Format("%S",pStr);
    str=p;    

3. ANSI、Unicode和寬字符之間的轉換
    I.MultiByteToWideChar:ANSI->Unicode
        char *szProgID = "MAPI.Folder";
        WCHAR szWideProgID[128];
        CLSID clsid;
        long lLen = MultiByteToWideChar(CP_ACP,0,

                                                             szProgID,strlen(szProgID),

                                                             szWideProgID,sizeof(szWideProgID));
        szWideProgID[lLen] = '\0';    
    
      WideCharToMultiByte:Unicode->ANSI
        // 假設已經有了一個Unicode 串 wszSomeString...
        char szANSIString [MAX_PATH];
        WideCharToMultiByte ( CP_ACP, WC_COMPOSITECHECK,

                                             wszSomeString, -1,

                                             szANSIString, sizeof(szANSIString),

                                              NULL, NULL );
      
    II.  
      TCHAR tstr[] = _T("this is a test");
      wchar_t wszStr[] = L"This is a test";

arrow
arrow
    全站熱搜

    天才R 發表在 痞客邦 留言(1) 人氣()