《Windows核心編程》——二字符與字符串處理

Unicode的好處:Unicode會增加程序的執行性能,併爲本地化工作奠定基礎,有利於同COM和.Net Framework的互操作。

2.1 字符編碼

用戶一直在將文本字符串編碼成一組以0結尾的單字節字符,並調用strlen,它會返回“以0結尾的一個ANSI單字節字符數組”中的字符數。但是一個字節最多隻能表示256個符號。但是很多國家的文字超過256個符號。所以就有了雙字節字符串,這種字符串中的每個字符都是由1個字節或者2個字節組成。

UTF16編碼:UTF(unicode transformation format(unicode轉換格式)),將每個字符編碼爲2個字節或者說16位。

UTF8編碼:將一些字符編碼爲1個字節、一些字符編碼爲2個字節、一些字符編碼爲3個字節、一些字符編碼爲4個字節。

UTF32編碼:將每個字符都編碼爲4個字節。


2.2 ANSI字符和Unicode字符與字符串數據類型

C語言用char數據類型來表示一個8位ANSI字符。默認情況下,在源代碼中聲明一個字符串時,C編譯器會把字符串中的字符轉換成由8位char數據類型構成的一個數組,每個字符之間用0進行填充:

//an 8-bit character

char c = ‘A';


//An array of 99 8-bit character and 8-bit terminating zero

char czBuffer[100] = "A string";

同理wchar_t表示一個16位unicode(UTF16)字符。


2.3 Windows中的Unicode函數與ANSI函數

Vistual Studio創建一個新的項目時,它默認定義爲Unicode。Windows中的函數會自行進行轉換。


2.4 C運行庫中的Unicode函數與ANSI函數

C運行庫中的函數不會自行進行轉換。在C運行庫中,strlen就是一個能返回ANSI字符串長度的函數。與之對應的是wcslen能返回Unicode字符串的長度。現在應該在代碼中調用_tcslen,它自己會根據編譯器定義的宏進行選擇。針對不屬於C++標準一部分的標識符,C運行庫始終會爲它們附加下劃線前綴。


2.5 C運行庫中的安全字符串函數

任何修改字符串的函數都存在一個安全隱患:如果目標字符串緩衝區不夠大,無法容納所生成的字符串,就會導致內存中的數據被破壞。必須在包含其他所有文件之後才包含StrSafe.h。

有些方法的名稱中,都含有一個“Cch”,這表示Count of character,即字符數;通常使用_countof宏來獲取此值。另外還有一序列名稱中含有“Cb”的函數,這些函數要求用字節數來指定大小,而不是字符數;通常使用sizeof操作符來獲取此值。

用戶應該一開始就將文本字符串想象成字符的數組,而不是char或字節的數組。


發佈了15 篇原創文章 · 獲贊 6 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章