總體簡介:
由於字元編碼的不同,在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(字串)詳解(一)
杜思波
轉貼 VC中Unicode字串的處理
unicode 寬位元組字符集 1.如何取得乙個既包含單位元組字元又包含雙位元組字元的字串的字元個數?可以呼叫microsoft visual c 的執行期庫包含函式 mbslen來操作多位元組 既包括單位元組也包括雙位元組 字串。呼叫strlen函式,無法真正了解字串中究竟有多少字元,它只能告訴你...
轉貼 VC中Unicode字串的處理
unicode 寬位元組字符集 1.如何取得乙個既包含單位元組字元又包含雙位元組字元的字串的字元個數?可以呼叫microsoft visual c 的執行期庫包含函式 mbslen來操作多位元組 既包括單位元組也包括雙位元組 字串。呼叫strlen函式,無法真正了解字串中究竟有多少字元,它只能告訴你...
轉貼 VC中Unicode字串的處理
unicode 寬位元組字符集 1.如何取得乙個既包含單位元組字元又包含雙位元組字元的字串的字元個數?可以呼叫microsoft visual c 的執行期庫包含函式 mbslen來操作多位元組 既包括單位元組也包括雙位元組 字串。呼叫strlen函式,無法真正了解字串中究竟有多少字元,它只能告訴你...