字串處理

2021-06-09 18:17:57 字數 3270 閱讀 5944

總體簡介:

由於字元編碼的不同,在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...