基于windows編程開發(fā),,字符類型肯定是少不了的,收集整理一下關(guān)于 windows下的基本類型,,以便遺忘查看. C++主要使用的是C-Style字符串,,而M$在Windows中又增加了很多C-Style字符串的變體。這個(gè)一多嘛,,就容易亂~ 所謂字符串,,就是由字符組合而成,所以我們先來查看一下字符類型,。 首先,,存在兩種最基本的字符類型:char和wchar_t。char大家都很熟悉了,,我就跳過,。至于wchar_t,是應(yīng)用于UNICODE的寬字符,,即一個(gè)字符2Bytes,,16Bits。事實(shí)上,,Windows中利用 typedef unsigned short wchar_t 然后為了書寫方便(MS我也沒覺得有多大差別),,M$又把那兩個(gè)基本字符類型重新的給他typedef了一遍,即: typedef char CHAR
這樣,,你不用關(guān)心是要使用ANSI字符串還是Unicode,編譯器會(huì)自動(dòng)根據(jù)你的OS來選擇,。 說明: typedef CHAR* LPSTR typedef WCHAR* LPWSTR typedef TCHAR* LPTSTR ps:你會(huì)在某些地方看到存在PSTR/PWSTR/PTSTR等等,,與上面的只卻一個(gè)L的字符串指針類型,。實(shí)際上,這個(gè)是長指針和短指針問題,。LPXX是長指針,,PXX是短指針。不過在32Bit的系統(tǒng)上,,二者已經(jīng)沒有區(qū)別,。 BSTR: BSTR是為了與原先的basic字符兼容。主要用來和VB打交道的(VB里的string就是指它),。一個(gè) BSTR 由頭部和字符串組成,,頭部4字節(jié)包含串長信息,串中可以包含嵌入的 null 值,。這種帶長度前綴的字符串,主要由操作系統(tǒng)來管理的,所以要用api.操作它的API函數(shù)很多,,如SysAllocString,SysFreeString等.
為了增強(qiáng)程序的通用性,,還必須注意以下幾點(diǎn): cLPTSTR、LPCSTR,、LPCTSTR,、LPSTR的意義: 1,、既然程序里不能出現(xiàn)char,,那表示字符串時(shí),就不能再習(xí)慣性的用char*了,。應(yīng)該改為TCHAR*,,或者是PTSTR,。后一種是 windows的變量,類似的有:PSTR,、PTSTR,、LPTSTR、LPSTR,、PCTSTR等等等等,。這也是讓人一開始接觸會(huì)頭大的地方。其實(shí)并非如此恐怖,,我以PCTSTR為例做個(gè)解釋:P代表指針(和LP是一個(gè)東西,,LP的本意是Long Pointer,16位windows時(shí)代的遺留物,。),,C代表const,T代表TCHAR,,STR代表字符串,。所以PCTSTR其實(shí)就是const TCHAR* 的意思。而PSTR也就是char* 的意思,。所以我們?cè)诒硎咀址畷r(shí)也不能使用PSTR等不帶T的變量類型名,。 2、表示字符串常量時(shí),,不能簡單的用雙引號(hào)括起來,,因?yàn)槟谴韆scii字符串。同樣也不能在前面加L,,因?yàn)槟谴韚nicode,。我們的程序要做到的是通用性,即不是ascii也不是unicode,。所以我們?cè)谧址皯?yīng)該加的是TEXT,,比如MessageBox(NULL,TEXT("Fypher"),TEXT("FF"),MB_OK)。TEXT還可用于字符,。比如TCHAR m=TEXT('A'); 3,、TCHAR FF[50]。FF能裝多少字符,?哈,!不要習(xí)慣性的sizeof(FF)了,應(yīng)該_countof(FF)或者sizeof(FF)/sizeof(TCHAR),。因?yàn)槲覀儾淮_定TCHAR到底是char 還是 wchar_t,。 4、該和一堆老朋友說再見了……我們不能再使用以前的字符串處理函數(shù)或者字符處理函數(shù)了,。比如strlen,、strcat,、strcmp等等等等……因?yàn)檫@些是ascii專用的,通通改成使用T家族的吧,。前綴都換成_tcs,。比如_tcslen、_tcscat,、_tcscmp等等……順便補(bǔ)充一下wcs前綴是wchar_t使用的,。恩,還有大家用得超爽的sprintf,,今后就改成_stprintf了吧~呵呵,。補(bǔ)充:swprintf是 wchar_t它家的。對(duì)了,,windows認(rèn)為_tcscpy,、_tcscat等不安全,所以使用這些函數(shù)編譯器會(huì)報(bào)警,??梢愿挠脀indows推出的 _tcscpy_s、_tcscat_s等“安全”函數(shù),,其實(shí)就是多了個(gè)參數(shù)用來指明緩沖區(qū)大?。ㄓ浀糜胈countof哦~!^_^),。windows 還推出了形如StringCchCat的一套字符串處理函數(shù),,我沒怎么用過。windows也有一個(gè)字符串比較函數(shù)CompareString,。功能比 _tcscmp強(qiáng)大多了,。比如可以設(shè)置忽略大小寫等。 5,、IsTextUnicode函數(shù)可以用過一系列統(tǒng)計(jì)學(xué)的方法判斷某個(gè)字符串是不是unicode字符串,。 MultiByteToWideChar和WideCharToMultiByte函數(shù)可實(shí)現(xiàn)Ascii和Unicode字符串的相互轉(zhuǎn)化。這些的使用場合都不大,。因?yàn)槲覀兊某绦驊?yīng)該做到“沒有”ascii和unicode,。 6,、恩,,雖然絕大多數(shù)情況下應(yīng)該使用TCHAR,但是記住GetProcAdress這個(gè)特殊的函數(shù)吧,,它的參數(shù)只能是char*,。因?yàn)樵趯?dǎo)出函數(shù)表里函數(shù)名是用ascii碼寫的…… 7、最后一點(diǎn),,記得要#include <tchar.h>哦,!呵呵~ 由于windows內(nèi)核采用的是UNICODE,,UNICODE版的程序必然比ASCII版的程序效率高(比如不用在調(diào)用函數(shù)時(shí)在堆里分配空間把參數(shù)轉(zhuǎn)成 UNICODE,然后再調(diào)用UNICODE版的函數(shù)),,所以我們最好是在程序的開頭加上#define UNICODE和#define _UNICODE,,把程序轉(zhuǎn)換成UNICODE版的。如果程序的字符串處理完全按照上面的通用性要求做了是不會(huì)出錯(cuò)的,。 8,、注意:str前綴與wcs前綴都是標(biāo)準(zhǔn)C函數(shù),需要有標(biāo)準(zhǔn)C運(yùn)行庫才能夠使用,。而lstr前綴的是window提供的原生函數(shù),,不需標(biāo)準(zhǔn)C運(yùn)行庫。 |
|