新手做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庫。