vc開發windows程式時的字串問題的一個歸納(原創)

來源:互聯網
上載者:User
新手做windows開發首先的一個問題就是把字串搞懂。

一. 字元集簡史

字元是一個獨立於電腦的概念,沒有電腦仍然有字元,字元是文字元號,英語漢語日語還有各種標點符號都是字元。

字串就是字元組成的數組。

早先,電腦使用一個位元組來表示一個字元,位元組Byte是8位無符號數字,單位元組編碼ASCII可以表示大小寫英文與一些標點符號。

後來為了顯示漢字日語等亞洲文字,制定了雙位元組編碼,使用兩個或一個位元組來表示一個字元。

而且使用了字碼頁,兩個位元組在不同的字碼頁中,所代表的字元也是不同的,簡體中文字碼頁是GBK,繁體中文是BIG5等等。

這樣一個字串中,既有單位元組的字元,又有雙位元組字元,很難統計一個字串中的字元數量。

再後來有了UNICODE,UNICODE編碼體系中的UTF-16標準,規定一律使用兩個位元組表示一個字元,這樣可以表示世界上各種語言中的字元,不用字碼頁進行區分了,他們在UTF-16編碼系統中都有了自己的16位編碼了,雖然儲存空間增大了,但效率提升是明顯的。

二 各種字串處理函數庫

1 C運行庫對字串的處理:

str*系列:    C運行庫早期使用strlen strcpy等str*系列函數對char類型的字串進行處理。
wcs*系列:   C編譯器內建了wchar_t這個16位寬位元組類型後,使用新的wcslen wcscpy等wcs*系列的函數對wchar_t類型的字串進行處理。
_tcs*系列:  C運行庫定義了宏_tcslen _tcscpy等_tcs*系列的宏定義,_tcs*系列函數在編譯時間根據是否預定義了宏_UNICODE而確定是採用wcs*系列函數,否則採用str*系列函數。

_tcs*_s系列:  C運行庫的最新安全字串函數,為了防止緩衝區溢位而定義的新函數。

2 windowsTeam Dev對字串的處理:

WindowsTeam Dev在winnt.h中定義了新的資料類型CHAR(char), WCHAR(wchar_t), TCHAR,TCHAR最終在編譯時間根據是否預定義了UNICODE宏而確定是CHAR還是WCHAR。

lstr*a系列:  在windows作業系統的Kernel32.dll中定義,處理CHAR類型的字串,其實是對lstr*w的一層封裝。
lstr*w系列: 在windows作業系統的Kernel32.dll中定義,處理WCHAR類型的字串。
lstr*系列:   lstr*系列函數也是在編譯時間才根據是否預定義了UNICODE宏來確定採用lstr*a系列函數,還是lstr*w系列函數。

其實我比較常用的是lstr*系列,因為這個是windows api,這樣寫出來的程式可以不用把C運行庫連結進來。

有個需要注意的是,C運行庫的_UNICODE和Windows的UNICODE,兩個宏,要麼同時定義,要麼同時不定義。C運行庫首碼底線是為了遵守那個該死的C++標準(對於不屬於C++標準的宏加底線),而Windows沒有遵守那個標準。

========================================

儘管字串處理看起來很亂,但是抓住一個用就可以了,雖然目前推薦的標準是_tcs*_s系列,但是大家按自己的需要來使用,沒有介紹stl庫和mfc庫中的字串類型,因為那兩個庫是C++庫,不是C庫。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.