TCHAR 與CHAR

    因爲C++支持兩種字符串,即常規的ANSI編碼(使用""包裹)和Unicode編碼(使用L""包裹),這樣對應的就有了兩套字符串字符串處理函數,比如:strlen和wcslen,分別用於處理兩種字符串。
  微軟將這兩套字符集及其操作進行了統一,通過條件編譯(通過_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

在編寫Wince程序時,遇到了一個問題如下:有的函數的返回值是char型的,如何將其轉換成Tchar型,比如列舉註冊表函數RegEnumValue()返回的值中,有一個返回值是得到指定鍵的值。它是BYTE(unsigned char)型的,如何將其很容易的轉成Tchar型,用了函數MultiByteToWideChar(),但是總是隻轉第一個字符,這時可以把BYTE的值賦給CString變量,再用wcscpy函數把CString變量的值賦給TCHAR數組來解決。 

ANSI to Unicode:
--------------------------------------------------
char *pAnsiString = "Some test string";
CString strUnicode = pAnsiString;
---------------------------------------------------

如何把 char 轉爲LPCSTR
mbstowcs---Convert a multi-byte(ANSI) string to wide character stirng(Unicode).
wcstombs---Convert a wide character string to multi-byte string.
--------------------------------------------------

cstring TCHAR的互相轉換
cstring->TCHAR*的轉化可以用函數GetBuff()
函數原型爲:LPTSTR GetBuffer( int nMinBufLength );
cstring str("cstring");
 TCHAR* szMsg = new TCHAR[100];
 //其參數爲cstring字符串的長度
 szMsg = str.GetBuffer(str.GetLength());
 str.ReleaseBuffer();
 delete []szMsg;
 szMsg = NULL;
TCHAR*->cstring的轉化
TCHAR szTchar[18] = L"TCHAR";   
 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);  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章