Windows下的字符串處理(1)

最近感覺Windows下的字符串處理有點紊亂,準備系統學習下。在此做點筆記。

Unicode或者寬字符都沒有改變char數據型態在C中的含義。char繼續表示1個字節的儲存空間,sizeof (char)繼續返回1。

理論上,C中1個字節可比8位長,但對我們大多數人來說,1個字節(也就是1個char)是8位寬。

C中的寬字符基於wchar_t數據型態,它在幾個表頭文件包括WCHAR.H中都有定義,像這
樣:
typedef unsigned short wchar_t ;
因此,wchar_t數據型態與無符號短整數型態相同,都是16位寬。

wchar_t c = 'A' ;
變量c是一個雙字節值0x0041,是Unicode表示的字母A。(然而,因爲Intel微處理器從最
小的字節開始儲存多字節數值,該字節實際上是以0x41、0x00的順序保存在內存中。如果
檢查Unicode文字的計算機儲存應注意這一點。)

還可以用下面的語句定義寬字符數組:
static wchar_t a[] = L"Hello!"
該字符串也需要14個字節的儲存空間,sizeof (a) 將返回14。索引數組a可得到單獨的字符。
a[1] 的值是寬字符「e」,或者0x0065。


----------------------------------------------

char * pc = "Hello!" ;
我們可以調用
iLength = strlen (pc) ;
這時變量iLength將等於6,也就是字符串中的字符數。

wchar_t * pw = L"Hello!" ;
再次調用strlen :
iLength = strlen (pw) ;

首先一條警告,繼續執行結果是1.

原因:

字符串「Hello!」中的6個字符佔用16位:
0x0048 0x0065 0x006C 0x006C 0x006F 0x0021
Intel處理器在內存中將其存爲:
48 00 65 00 6C 00 6C 00 6F 00 21 00
假定strlen函數正試圖得到一個字符串的長度,並把第1個字節作爲字符開始計數,但接着
假定如果下一個字節是0,則表示字符串結束。
這個小練習清楚地說明了C語言本身和執行時期鏈接庫函數之間的區別。編譯器將字符串
L"Hello!" 解釋爲一組16位短整數型態數據,並將其保存在wchar_t數組中。編譯器還處理

數組索引和sizeof操作符,因此這些都能正常工作,但在連結時才添加執行時期鏈接庫函數,

例如strlen。這些函數認爲字符串由單字節字符組成。遇到寬字符串時,函數就不像我們所
希望那樣執行了。

所以提出了wcslen、wprintf等寬字符版的庫函數。但是這樣寫通用性就差了,所以又提出了

_tcslen、TCHAR。那麼在書寫字符串時爲了通用,提出了_T(x)宏。

如果定義了_UNICODE標識符,那麼一個稱作__T的
宏就定義如下:
#define __T(x) L##x
這是相當晦澀的語法,但合乎ANSI C標準的前置處理器規範。那一對井字號稱爲「粘貼符
號(token paste)」,它將字母L添加到宏參數上。因此,如果宏參數是"Hello!",則L##x
就是L"Hello!"。
如果沒有定義_UNICODE標識符,則__T宏只簡單地定義如下:
#define __T(x) x
此外,還有兩個宏與__T定義相同:
#define _T(x)__T(x)
#define _TEXT(x)__T(x)
在Win32 console程序中使用哪個宏,取決於您喜歡簡潔還是詳細。基本地,必須按下述
方法在_T或_TEXT宏內定義字符串文字:
_TEXT ("Hello!")
這樣做的話,如果定義了_UNICODE,那麼該串將解釋爲寬字符的組合,否則解釋爲8位的
字符字符串。


---------------------------------------

寬字符和 Windows

WINNT.H定義了新的數據型態,稱作CHAR和WCHAR:
typedef char CHAR ;
typedef wchar_t WCHAR ; // wc


WINNT.H表頭文件進而定義了可用做8位字符串指針的六種數據型態和四個可用做const
8位字符串指針的數據型態。這裏精選了表頭文件中一些實用的說明數據型態語句:
typedef CHAR * PCHAR, * LPCH, * PCH, * NPSTR, * LPSTR, * PSTR ;
typedef CONST CHAR * LPCCH, * PCCH, * LPCSTR, * PCSTR ;
前綴N和L表示「near」和「long」,指的是16位Windows中兩種大小不同的指標。在Win32
中near和long指標沒有區別。
類似地,WINNT.H定義了六種可作爲16位字符串指針的數據型態和四種可作爲const 16
位字符串指針的數據型態:
typedef WCHAR * PWCHAR, * LPWCH, * PWCH, * NWPSTR, * LPWSTR, * PWSTR ;
typedef CONST WCHAR * LPCWCH, * PCWCH, * LPCWSTR, * PCWSTR ;
至此,我們有了數據型態CHAR(一個8位的char)和WCHAR(一個16位的wchar_t),
以及指向CHAR和WCHAR的指標。與TCHAR.H一樣,WINNT.H將TCHAR定義爲一般的
字符類型。如果定義了標識符UNICODE(沒有底線),則TCHAR和指向TCHAR的指標就
分別定義爲WCHAR和指向WCHAR的指標;如果沒有定義標識符UNICODE,則TCHAR
和指向TCHAR的指標就分別定義爲char和指向char的指標:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章