天天看點

《Windows核心程式設計》讀書心得——字元和字元串處理(1)

l  ANSI和UNICODE編碼:

ANSI編碼中,1個字元可能占一個位元組、兩個位元組甚至多個位元組,且不同國家的文字有不同的規定,存在字元庫的沖突。

UNICODE編碼(包括UTF-8、UTF-16、UTF-32,最常用的是UTF-16),以UTF-16為例,每個字元占用固定大小的位元組數(2個位元組),當然,少數無法用2位元組表示的字元除外(這些字元可用代理,4位元組表示)。UNICODE編碼中,不同國家的文字分在不同的碼段,不存在字元庫的沖突,更有利于計算機的全球化需要。是以,微軟提倡使用UNICODE編碼,在WINDOWS NT以後的作業系統中,都是以UNICODE編碼的。

建議:我們自己寫在WINDOWS下運作的程式,最好也使用UNICODE編碼,因為這樣更高效。若使用ANSI編碼,在調用WINDOWS提供的函數時,函數内部會把字元串先轉換為UNICODE編碼,再交給作業系統,當作業系統将字元串返還給程式時,還需要再執行一次UNICODE到ANSI的轉換,是以會産生更多的時間和記憶體的開銷。

l  UNICODE字元串的表示方法:

wchar_t  c  =  L ’A’; (類型為wchar_t或WCHAR,大寫L表示使用UNICODE編碼)

l  推薦的字元和字元串處理方式:

(1)       用通用資料類型(如TCHAR/PTSTR)來表示字元串(這樣相容性更強);

(2)       用TEXT或_T宏表示字元串;

(3)       用明确的資料類型(如BYTE和PBYTE)表示位元組、緩沖區;

(4)       注意為字元串開辟空間的方式:

Malloc(nCharacters * sizeof(TCHAR))        推薦

Malloc(nCharacters)                     避免

(因為并不是任何情況下字元都占用1個位元組)

(5)       MultiByteToWideChar( )        ANSI轉UNICODE

WideCharToMultiByte( )        UNICODE轉ANSI

(6)       使用安全的字元串函數:

函數 表征符串大小的參數 字元串超長 安全性

strcpy

wcscpy

溢出 不安全

_tcscpy_s

_tcscat_s

字元個數(可用_countof函數計算) 置空 安全

StringCchCat

StringCchCopy

StringCchPrintf

字元個數 截斷 安全

StringCbCat

StringCbCopy

StringCbPrintf

字元串所占位元組數 截斷 安全

(7)       比較兩種字元串的函數:

CompareStringOrdinal:比較快,适用于檔案名、路徑XML元素、系統資料庫項的比較;

CompareString:考慮使用者區域設定,适用于比較使用者字元串。