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";
留言列表