資源描述:
《cstring與unicode字符集》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在應用文檔-天天文庫。
1、CString相關(guān)的知識1BSTR型轉(zhuǎn)化成CString型;2VARIANT型轉(zhuǎn)化成CString型;3載入字符串表資源;4CString和臨時對象;5CString的效率;6總結(jié)下面我分別討論。1、CString對象的連接 能體現(xiàn)出CString類型方便性特點的一個方面就字符串的連接,使用CString類型,你能很方便地連接兩個字符串,正如下面的例子:CStringgray("Gray");CStringcat("Cat");CStringgraycat=gray+cat;要比用下面的方法好得多:chargray[]="Gray";cha
2、rcat[]="Cat";char*graycat=malloc(strlen(gray)+strlen(cat)+1);strcpy(graycat,gray);strcat(graycat,cat);2、格式化字符串 與其用sprintf()函數(shù)或wsprintf()函數(shù)來格式化一個字符串,還不如用CString對象的Format()方法:CStrings;s.Format(_T("Thetotalis%d"),total); 用這種方法的好處是你不用擔心用來存放格式化后數(shù)據(jù)的緩沖區(qū)是否足夠大,這些工作由CString類替你完成?! ?/p>
3、格式化是一種把其它不是字符串類型的數(shù)據(jù)轉(zhuǎn)化為CString類型的最常用技巧,比如,把一個整數(shù)轉(zhuǎn)化成CString類型,可用如下方法:CStrings;s.Format(_T("%d"),total); 我總是對我的字符串使用_T()宏,這是為了讓我的代碼至少有Unicode的意識,當然,關(guān)于Unicode的話題不在這篇文章的討論范圍。_T()宏在8位字符環(huán)境下是如下定義的:#define_T(x)x//非Unicode版本(non-Unicodeversion)而在Unicode環(huán)境下是如下定義的:#define_T(x)L##x//Uni
4、code版本(Unicodeversion)所以在Unicode環(huán)境下,它的效果就相當于:s.Format(L"%d",total); 如果你認為你的程序可能在Unicode的環(huán)境下運行,那么開始在意用Unicode編碼。比如說,不要用sizeof()操作符來獲得字符串的長度,因為在Unicode環(huán)境下就會有2倍的誤差。我們可以用一些方法來隱藏Unicode的一些細節(jié),比如在我需要獲得字符長度的時候,我會用一個叫做DIM的宏,這個宏是在我的dim.h文件中定義的,我會在我寫的所有程序中都包含這個文件:#defineDIM(x)(sizeof
5、((x))/sizeof((x)[0])) 這個宏不僅可以用來解決Unicode的字符串長度的問題,也可以用在編譯時定義的表格上,它可以獲得表格的項數(shù),如下:classWhatever{...};Whateverdata[]={{...},...{...},};for(inti=0;i6、zeof(data)-1);//WRONG!lstrcpyn(data,longstring,DIM(data)-1);//RIGHTWriteFile(f,data,DIM(data),&bytesWritten,NULL);//WRONG!WriteFile(f,data,sizeof(data),&bytesWritten,NULL);//RIGHT造成以上原因是因為lstrcpyn需要一個字符個數(shù)作為參數(shù),但是WriteFile卻需要字節(jié)數(shù)作為參數(shù)。同樣需要注意的是有時候需要寫出數(shù)據(jù)的所有內(nèi)容。如果你僅僅只想寫出數(shù)據(jù)的真實長度,你可能
7、會認為你應該這樣做:WriteFile(f,data,lstrlen(data),&bytesWritten,NULL);//WRONG但是在Unicode環(huán)境下,它不會正常工作。正確的做法應該是這樣:WriteFile(f,data,lstrlen(data)*sizeof(TCHAR),&bytesWritten,NULL);//RIGHT 因為WriteFile需要的是一個以字節(jié)為單位的長度。(可能有些人會想“在非Unicode的環(huán)境下運行這行代碼,就意味著總是在做一個多余的乘1操作,這樣不會降低程序的效率嗎?”這種想法是多余的,你必
8、須要了解編譯器實際上做了什么,沒有哪一個C或C++編譯器會把這種無聊的乘1操作留在代碼中。在Unicode環(huán)境下運行的時候,你也不必擔心那個乘2操作會降低程序的效率