微軟將這兩套字符集及其操作進行了統一,通過條件編譯(通過_UNICODE和UNICODE宏)控制實際使用的字符集,這樣就有了_T("")這樣的字符串,對應的就有了_tcslen這樣的函數。
爲了存儲這樣的通用字符,就有了TCHAR:
當沒有定義_UNICODE宏時, TCHAR = char _tcslen = strlen
當定義了_UNICODE宏時, TCHAR = wchar_t _tcslen = wcslen
char是C語言標準數據類型,字符型,至於由幾個字節組成通常由編譯器決定,一般一個字節。Windows爲了消除各編譯器的差別,重新定義了一些數據類型,CHAR,TCHAR,LPSTR,LPCSTR幾個類型都是這樣。CHAR爲單字節字符。還有個WCHAR爲Unicode字符,即不論中英文,每個字有兩個字節組成。如果當前編譯方式爲ANSI(默認)方式,TCHAR等價於CHAR,如果爲Unicode方式,TCHAR等價於WCHAR。在當前版本LPCSTR和LPSTR沒區別,即以零結尾的字符串指針,相當於CHAR *。 LPSTR、LPCSTR相當於char *,所以這種類型變量的賦值等同於char *的賦值。
Ex1: LPSTR lpstrMsg = "I'm tired.";
Ex2: char strMsg[]="I'm tired.";
LPSTR lpstrMsg = (LPSTR) strMsg;
unsigned short * 和 char* : 一個是寬字符,一個是多字節,兩種編碼是不一樣的。
如果你的程序要想在全球發佈,一定要使用寬字符Unicode,不然在別的操作系統上,多字節字符,比如中文,會顯示成亂碼。
Unicode把所有的字,各國語言的文字全部統一編碼了,而多字節則是有碼錶區分的,我國是GB_2312,臺灣是Big5.
TChar strFileName[MAX_PATH] = TEXT("");
char strFileName[MAX_PATH]="";
這兩種定義在使用上有何不同?
TEXT就是L
有點象這樣:
#define TEXT(str) L##str
##是連接的意思就是將L和str聯在一起了,表示寬字符。
l"Hello World",和"Hello World"是不同的,前一個佔用24個char,後一個佔用了12個char
如果定義了
#define UNICODE
TCHAR就代表寬字符wchar(2*sizeof(char)),否則TCHAR就代表char
也就是說在有
#define UNICODE
的情況下
TChar strFileName[MAX_PATH] = TEXT(""); //代表定義了一個空的寬字符串
char strFileName[MAX_PATH]="";//代表定義了一個ASCII字符串
如果沒有定義#define UNICODE那麼
TChar strFileName[MAX_PATH] = TEXT(""); //編譯器似乎會報錯,沒嘗試過
char strFileName[MAX_PATH]="";//代表定義了一個ASCII字符串
int len=0;
char *temp;
strcpy(temp,"hello");
len=strlen(temp);
char *unicodechar; //不一定是char*型,應該是什麼型
int unicodelen;
//如何把temp=>unicodechar,並且長度爲unicodechar的byte長度
比如
temp="a" len=1
unicodechar=0x000x61 unicodelen=2;
將ANSI轉換到Unicode
(1)通過L這個宏來實現,例如: CLSIDFromProgID( L"MAPI.Folder",&clsid);
(2)通過MultiByteToWideChar函數實現轉換,例如:
char *szProgID = "MAPI.Folder";
WCHAR szWideProgID[128];
CLSID clsid;
long lLen = MultiByteToWideChar(CP_ACP,0,szProgID,strlen(szProgID),szWideProgID,sizeof(szWideProgID));
szWideProgID[lLen] = '\0';
(3)通過A2W宏來實現,例如:
USES_CONVERSION;
CLSIDFromProgID( A2W(szProgID),&clsid);
char to TCHAR , TCHAR to char
ANSI to Unicode:
char *pAnsiString = "Some test string";
CString strUnicode = pAnsiString;
---------------------------------------------------
mbstowcs---Convert a multi-byte(ANSI) string to wide character stirng(Unicode).
wcstombs---Convert a wide character string to multi-byte string.
cstring str("cstring");
TCHAR* szMsg = new TCHAR[100];
//其參數爲cstring字符串的長度
szMsg = str.GetBuffer(str.GetLength());
str.ReleaseBuffer();
delete []szMsg;
szMsg = NULL;
cstring str;
str.Format(_T("%s"),szTchar);
-------------------------------------------------------------
Unicode to ANSI:
char* GetAnsiString(const CString &s)
{
int nSize = s.GetLength();
char *pAnsiString = new char[nSize+1];
wcstombs(pAnsiString, s, nSize+1);
return pAnsiString;
}
CString strUnicode = _T("Some test string");
char *pAnsiString = GetAnsiString(strUnicode);