char是C語言标準資料類型,字元型,至于由幾個位元組組成通常由編譯器決定,一般一個位元組。Windows為了消除各編譯器的差别,重新定義了一些資料類型,你提到了另外幾個類型都是這樣。CHAR為單位元組字元。還有個WCHAR為Unicode字元,即不論中英文,每個字有兩個位元組組成。它實際定義在<string.h>裡: typedef unsigned short wchar_t。
下面在看看TCHAR。如果你希望同時為ANSI和Unicode編譯的源代碼,那就要include TChar.h。TCHAR是定義在其中的一個宏,它視你是否定義了_UNICODE宏而定義成char或者wchar_t。如果目前編譯方式為ANSI(預設)方式,TCHAR等價于CHAR,如果為Unicode方式,TCHAR等價于WCHAR。
不能使用類似strcpy這樣的ANSI C字元串函數來處理wchar_t字元串,必須使用wcs字首的函數,例如wcscpy。為了讓編譯器識别Unicode字元串,必須以在前面加一個“L”,例如:
wchar_t *szTest=L"This is a Unicode string.";
如果你使用了TCHAR,那麼就不應該使用ANSI的strXXX函數或者Unicode的wcsXXX函數了,而必須使用TChar.h中定義的_tcsXXX函數。另外,為了解決剛才提到帶“L”的問題,TChar.h中定義了一個宏:“_TEXT”。
以strcpy函數為例子,總結一下:
.如果你想使用ANSI字元串,那麼請使用這一套寫法:
char szString[100];
strcpy(szString,"test");
.如果你想使用Unicode字元串,那麼請使用這一套:
wchar_t szString[100];
wcscpyszString,L"test");
.如果你想通過定義_UNICODE宏,而編譯ANSI或者Unicode字元串代碼:
TCHAR szString[100];
_tcscpy(szString,_TEXT("test"));
在目前版本LPCSTR和LPSTR沒差別,即以零結尾的字元串指針,相當于CHAR *。
LPCSTR A 32-bit pointer to a constant character string.
常量指針,一般用于參數傳遞和固定字元串
LPSTR A 32-bit pointer to a character string.
普通指針,一般用于字元串操作
根據DBCS或Unicode 自動選擇char或wchar_t類型,由定義的宏_UNICODE決定
LPCTSTR A 32-bit pointer to a constant character string that is portable for Unicode and DBCS.
LPTSTR A 32-bit pointer to a character string that is portable for Unicode and DBCS.
一個轉換CString 的例子。
CString str = "ABC";
LPCTSTR ptr1 = new TCHAR[str.GetLength()+1];
ptr1 = (LPCTSTR) str.GetBuffer();
LPTSTR ptr2 = new TCHAR[str.GetLength()+1];
ptr2 = (LPTSTR) str.GetBuffer();
LPSTR ptr3 = new char[str.GetLength()+1];
ptr3 = (LPSTR) str.GetBuffer();
LPCSTR ptr4 = new char[str.GetLength()+1];
ptr4 = (LPCSTR) str.GetBuffer();
另外,要注意選用的函數也要和string類型一緻。比如下面:tmp1=144,tmp2=1,因為sLastChan為寬位元組,存儲為310034003400, atoi函數遇到第一個"00"就會結束。
CString sLastChan = _T("144");
int tmp1 = _tstoi((TCHAR*)sLastChan.GetBuffer(sLastChan.GetLength()));
tmp2 = atoi((char*)sLastChan.GetBuffer(sLastChan.GetLength()));