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:考慮使用者區域設定,适用于比較使用者字元串。