總體簡介:
由於字元編碼的不同,在c++中有三種對於字元型別:char, wchar_t , tchar。其實tchar不能算作一種型別,他緊緊是乙個巨集。我們都知道,巨集在預編譯的時候會被替換成相應的內容。tchar 在使用多位元組編碼時被定義成char,在unicode編碼時定義成wchar_t。
1.vc++中的char,wchar_t,tchar
大家一起做乙個專案,經常發現有的人愛用strcpy等標準ansi函式,有的人愛用_t***x函式,這個問題曾經搞的很混亂。為了統一,有必要把來龍去脈搞清楚。
為了搞清這些函式,就必須理請幾種字元型別的寫法。char就不用說了,先說一些wchar_t。wchar_t是unicode字元的資料型別,它實際定義在裡:
typedef unsigned short wchar_t;
不能使用類似 strcpy這樣的ansi c字串函式來處理wchar_t字串,必須使用wcs字首的函式,例如wcscpy。為了讓編譯器識別unicode字串,必須以在前面加乙個 「l」,例如:
wchar_t *sztest=l"this is a unicode string.";
下面在看看tchar。如果你希望同時為ansi和unicode編譯的源**,那就要include tchar.h。tchar是定義在其中的乙個巨集,它視你是否定義了_unicode巨集而定義成char或者wchar_t。如果你使用了tchar,那麼就不應該使用ansi的str***函式或者unicode的wcs***函式了,而必須使用tchar.h中定義的_tcs***函式。另外,為了解決剛才提到帶「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"));
2.字串及處理之三: 使用tchar系列方案
3.字串及處理之二: 基本字串型別及函式
常用的字串型別有:char * ,wchar_t * ,wchar * , tchar *
char *
最基本的型別,其對應的一組處理函式是以str...開頭的標準的ansi c字串函式。
wchar_t *
是這樣定義的:typedef unsigned short wchar_t;
另外,在標頭檔案中有這樣的定義:typedef wchar_t wchar; 所以wchar實際就是wchar_t
wchar_t * 是16-bit unicode character(寬字元)所使用的基本型別。
其對應的一組處理函式是以wcs...開頭的標準的字串函式。
常用的字串處理函式和巨集:
1、str 開頭的 函式 處理sbcs字串
2、wcs 開頭的 函式 處理寬字串,wcs是寬字串的英文縮寫
所有的unicode函式均以wcs開頭。若要呼叫unicode函式,只需用字首wcs來取代ansi字串函式的字首str即可。
對於每乙個標準的ansi c字串函式,基本都有等價的unicode函式.
3、_mbs 開頭的 函式 處理dbcs字串
微軟還在它的crt(c runtime library)中增加了操作dbcs字串的版本。str***()函式都有對應名字的dbcs版本_mbs***()。
如果你料到可能會遇到dbcs字串(如果你的軟體會被安裝在使用dbcs編碼的國家,如中國,日本等,你就可能會),你應該使用_mbs***()函式,因為他們也可以處理sbcs字串。(乙個dbcs字串也可能含有單位元組字元,這就是為什麼_mbs***()函式也能處理sbcs字串的原因)。微軟還提供了幾個函式方便對dbcs的處理 , 見後面的描述。
如果只是呼叫strlen函式,那麼你無法真正了解字串中究竟有多少字元,它只能告訴你到達結尾的0之前有多少個位元組。ansi的c執行期庫中沒有配備相應的函式,使你能夠對雙位元組字符集進行操作。但是,microsoft visual c++的執行期庫卻包含許多函式,如_mbslen ,它可以用來操作多位元組(既包括單位元組也包括雙位元組)字串。
4、_tcs 開頭的 巨集 配合tchar使用
根據預定義分別擴充套件為str wcs _mbs, 見後面的描述。
5、l開頭的windows自帶的寬字元處理函式
6、大小寫兼有的 windows自帶的寬字元處理函式
5和6見後面的描述
更進一步的字串以及其指標的型別定義
由於win32 api文件的函式列表使用函式的常用名字(例如, "setwindowtext"),所有的字串都是用tchar來定義的。(除了xp中引入的只適用於unicode的api)。下面列出一些常用的 typedefs,你可以在msdn中看到他們。
type meaning in mbcs builds meaning in unicode builds
wchar wchar_t wchar_t
lpstr char* char*
lpcstr const char* const char*
lpwstr wchar_t* wchar_t*
lpcwstr const wchar_t* const wchar_t*
tchar char wchar_t
lptstr tchar* tchar*
lpctstr const tchar* const tchar*
4.strings(字串)詳解(一)
字串處理 字串反轉
請原諒博主今天很閒,於是乎博主又開始更新微博了。這次要更新的問題是 編寫乙個函式,反轉乙個單詞的順序。例如 do or do not,there is no try.就要反轉成 try.no is there not,do or do 大家要認真看看這道題,這道題和大家想象的貌似有點不同。首先字串反...
字串處理
uncode與ansi字串轉換 我們使用windows函式multibytetowidechar將多位元組字串轉換成寬字元字串。函式如下 int multibytetowidechar uintcodepage dworddwflags lpcstrlpmultibytestr intcbmulti...
字串處理
byte array new byte 2 array system.text.encoding.default.getbytes 啊 int i1 short array 0 0 int i2 short array 1 0 unicode解碼方式下的漢字碼 array system.text.e...