Windows程式設計下的字串

NO IMAGE

目錄

1.  什麼是Unicode字元&&ANSI字元

 2. 字串資料型別

3. CHAR和WCHAR

4. Windows的Unicode函式和ANSI函式

5. C執行庫中的Unicode函式和ANSI函式


Windows程式設計支援Unicode和ANSI字元,因此其使用的字元型別不像C 或C,只有一種字元型別(即ANSI型別)。所以Windows程式設計會定義一個巨集,根據程式支援何種字元而使用對應字元。

1.  什麼是Unicode字元&&ANSI字元

首先簡單介紹一下什麼是Unicode字元&&ANSI字元,瞭解的同學可以跳過這part啦~

ANSI字元是指用一個位元組即8bit標識一個字元,而Unicode字元是用多個位元組標識一個字元,Unicode字符集固定使用16bit標識一個字元,因此其可以標識65536個字元。後來為了雙位元組的Unicode能夠在現存的處理單位元組的系統上正確傳輸,出現了UTF-8,即使用8bit標識一個字元。

 2. 字串資料型別

ANSI字元 or Unicode字元資料型別
ANSI字元char
Unicode字元

                              wchar_t

C語言用char型別標識一個8位ANSI字元,而Windows程式設計下的C/C 編譯器定義了一個內建的資料型別wchar_t,標識一個16位UNICODE(UTF16)字元

  • 宣告Unicode字元和字串的方法:
    wchar_t c = L'A';
wchar_t szBuffer[100] = L"A String";

字串之前的大寫字母L通知編譯器該字串應當編譯為一個Unicode字串(UTF16)。

3. CHAR和WCHAR

為了與C語言稍微有一些區分,Windows開發團隊希望定義自己的資料型別,因此有了CHAR和WCHAR。於是他們在Windows標頭檔案WinNT.h中定義以下資料型別:

    typedef char CHAR; // 一個8bit字元,即ANSI字元
typedef wchar_t WCHAR; // 一個16bit字元,即Unicode字元
// 還定義了一堆指向8bit字元的指標
typedef CHAR *PCHAR; // 其實就是相當於char*
typedef CHAR *PSTR;
typedef CONST CHAR *PCSTR;
// 指向16bit字元的指標
typedef WCHAR *PWCHAR;
typedef WCHAR *PWSTR;
typedef CONST WCHAR *PCWSTR;

Windows開發團隊想用自己特有的資料型別,因此出現CHAR等字元型別,這只是在標頭檔案再定義一次而已~類似於起外號花名吧,都是同一個人,不用叫法而已~٩(๑❛ᴗ❛๑)۶

為了寫程式碼方便,可以使用ANSI或Unicode字元通過編譯,WinNT.h定義了以下型別和巨集:

    #ifdef  UNICODE         
typedef WCHAR TCHAR, * PTCHAR ;
typedef LPWSTR LPTCH, PTCH, PTSTR, LPTSTR ;
typedef LPCWSTR LPCTSTR ;
#define __TEXT(quote) L##quote
#else
typedef char TCHAR, * PTCHAR ;
typedef LPSTR LPTCH, PTCH, PTSTR, LPTSTR ;
typedef LPCSTR LPCTSTR ;
#define __TEXT(quote) quote
#endif    
#define TEXT(quote) __TEXT(quote)

emmm,寫到這有個感受:標頭檔案#define和typedef太會玩了〒▽〒 對於初學者來說,明明是同一個東西但是有好多個名字,感覺會有點亂~不過後面習慣後就會覺得很方便噠,每一個資料型別都可以顧名思義~

4. Windows的Unicode函式和ANSI函式

Windows的所有版本都完全用Unicode構建,即若呼叫Windows函式時,如果向它傳入一個ANSI字串(即由單位元組字元組成的一個字串),函式會先將字串轉換為Unicode,再將結果傳給作業系統。

如果一個Windows函式的引數列表中有字串,則該函式通常有兩個版本,eg:一個CreateWindowEx接受Unicode字串,另一個CreateWindowEx則接受ANSI字串。但平時我們一般呼叫CreateWindowEx,這實際就是一個定義的巨集

    #ifdef UNICODE
#define CreateWindowEx CreateWindowExW
#else
#define CreateWindowEx CreateWindowExA
#endif 

5. C執行庫中的Unicode函式和ANSI函式

C執行庫提供了一系列函式來處理ANSI和UNICODE字元和字串,它和Windows不同的是,函式都是“自力更生”的,如ANSI版本的函式不會把字串轉換為UNICODE形式,再從內部呼叫函式的UNICODE版本。

eg:strlen是一個能返回ANSI字串長度的函式,與之對應的是wcslen,其返回的是UNICODE字串的長度。(原型都在String.h)。為了使原始碼既能用ANSI編譯,又能用UNICODE編譯,還必須包含TChar.h,該檔案定義了以下巨集:

    #ifdef _UNICODE
#define _tcslen wcslen
#else
#define _tcslen strlen
#endif

PS: 針對不屬於C 標準一部分的識別符號,C執行庫始終會為它們附加下劃線字首。 

PPS:在應用程式中,應確保同時定義UNICODE和_UNICODE,要麼一個都不要定義。

 

此文只是本人對字串知識梳理,今天就先到這了~下次get到新的點再更新啦~ヾ(◍°∇°◍)ノ゙