基本準(zhǔn)則
- 將文本字符想象成字符的數(shù)組,而不是char或字節(jié)的數(shù)組。
- 用通用的數(shù)據(jù)類型來表示文本字符和字符串。
- 用明確的數(shù)據(jù)類型來表示字節(jié)、字節(jié)指針和數(shù)據(jù)緩沖區(qū)。
- 用TEXT或_T來表示字面量字符和字符串,但要注意,避免兩者混用。
- 執(zhí)行全局替換。
- 修改與字符串有關(guān)的計算。
緩沖區(qū)大小的字符數(shù):_countof(szBuffer)
字節(jié)數(shù):sizeof(szBuffer)
內(nèi)存是以字節(jié)來分配的,所以在給一個字符串申請內(nèi)存塊的時候,用的是malloc(mCharacters*sizeof(TCHAR)),一定要記住,需要乘數(shù)據(jù)類型的大??!
- 避免使用printf系列函數(shù),尤其是不要用%s和%S字段類型來進行ANSI和Unicode字符串之間的相互轉(zhuǎn)換。正確:MultiByteToWideChar和WideCharToMultiByte
int MultiByteToWideChar(
_In_ UINT CodePage,//標(biāo)識了與多字節(jié)字符串關(guān)聯(lián)的一個代碼頁值
_In_ DWORD dwFlags,//額外的控制,一般不使用這個標(biāo)識,所以傳0
_In_ LPCSTR lpMultiByteStr,//要轉(zhuǎn)換的字符串
_In_ int cbMultiByte,//指定字符串的長度(如果是-1,則函數(shù)自動判斷源字符串的長度)
_Out_opt_ LPWSTR lpWideCharStr,//指定Unicode版本的字符串寫入內(nèi)存緩沖區(qū)的地址
_In_ int cchWideChar//制定要寫入的緩沖區(qū)的最大長度。(如果這個參數(shù)傳0,那么函數(shù)就不會執(zhí)行轉(zhuǎn)換,而是返回一個寬字符(包括終止符),只有緩沖區(qū)能夠容納該數(shù)量的寬字符,轉(zhuǎn)換才會成功)
);
int WideCharToMultiByte(
_In_ UINT CodePage,
_In_ DWORD dwFlags,
_In_ LPCWSTR lpWideCharStr,
_In_ int cchWideChar,
_Out_opt_ LPSTR lpMultiByteStr,
_In_ int cbMultiByte,
_In_opt_ LPCSTR lpDefaultChar,//如果遇到不能轉(zhuǎn)換的寬字符,函數(shù)就會使用一個這個參數(shù)指向的字符,而不是系統(tǒng)默認(rèn)的字符(通常是?,超級不安全)。
_Out_opt_ LPBOOL lpUsedDefaultChar//如果至少有一個字符不能轉(zhuǎn)換為對應(yīng)的多字節(jié)形式,那么這個參數(shù)就會被設(shè)為TRUE;所有都轉(zhuǎn)換成功,這個變量就會被設(shè)為FALSE。這個參數(shù)通常傳NULL。
);
- UNICODE和UNICODE要么同時指定要么都不指定。
字符串操作準(zhǔn)則
- 始終使用安全的字符串處理函數(shù),比如后綴為s的函數(shù)和前綴為StringCch的系列函數(shù)。后者主要是在我們想明確控制截斷的時候使用,如果不想明確控制截斷,則首選前者。
- 盡量不要使用不安全的c運行庫字符串處理函數(shù)。如果一個緩沖區(qū)處理函數(shù)的參數(shù)中不包括目標(biāo)緩沖區(qū)的長度,那么我們應(yīng)該避免使用/自己實現(xiàn)這樣的函數(shù),使用相應(yīng)的替代函數(shù)。
- 不要用Kernel32方法來進行字符串處理。比如lstrcat和lstrcpy
- 比較兩種字符串。
程序字符串(包括文件名、路徑、XML元素/屬性以及注冊表項/值等)用CompareStringOrdinal來進行比較(因為它非常快,而且不會考慮用戶的區(qū)域設(shè)置)。
CompareString(Ex)用來比較用戶字符串(要在用戶界面上顯示),因為在比較字符串的時候,這個函數(shù)會考慮用戶的區(qū)域設(shè)置。
int CompareString(
_In_ LCID Locale,//指定一個區(qū)域設(shè)置ID(一個32位值),用來標(biāo)識一種語言。
_In_ DWORD dwCmpFlags,//一組標(biāo)志,比較字符串時的方法。
_In_ LPCTSTR lpString1,
_In_ int cchCount1,
_In_ LPCTSTR lpString2,
_In_ int cchCount2
);
int CompareStringEx(
_In_opt_ LPCWSTR lpLocaleName,
_In_ DWORD dwCmpFlags,
_In_ LPCWSTR lpString1,
_In_ int cchCount1,
_In_ LPCWSTR lpString2,
_In_ int cchCount2,
_In_opt_ LPNLSVERSIONINFO lpVersionInformation,
_In_opt_ LPVOID lpReserved,
_In_opt_ LPARAM lParam
);
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。