多字符集(ANSI)和UNICODE及字符串處理方式準則

在我們編寫程序的時候,使用最多的是字符串的處理,而ANSI和UNICODE的相互轉換經常搞的我們頭暈眼亂。

應該說UNICODE是一種比較好的編碼方式,在我們的程序中應該儘量使用UNICODE編碼方式,我們在編寫程序的時候,最好能依據下面的準則來進行:

基本準則:

1.將文本字符串想象爲字符數組,而非char或字節數組

2.開始使用通用數據類型來表示文本字符和字符串(如TCHAR,PTSTR)

原因是我們可以在WinNT.h的頭文件中找到如下定義(代碼有刪改):

3.用明確的數據類型來表示字節,字節指針和數據緩衝區(如BYTE, PBYTE)原因如上同

4.使用TEXT或是_T來表示字面量字符和字符串(這兩個宏會根據你自己設置的字符集屬性,動態轉換成相應的字符集)

5.執行全局替換,原因同2.

6.修改與字符串有關的計算。如有些函數需要我們傳入緩衝區大小的字符數,這個時候就需要_countof(szBuffer),而不是sizeof(szBuffer);

   有些時候我們需要爲一個字符串分配內存,那麼內存是使用字節數來分配的,這個時候我們就需要使用malloc(nCharacters*sizeof(TCHAR)),而不是使用malloc(nCharacters).

    我們可以使用如下樣式的宏來處理這個問題:

   

7.儘量避免使用printf系列的函數,尤其是有%s,%S字段類型來進行ANSI和Unicode字符串之間的相互轉換。正確的做法是使用MultiByteToWideChar和WideCharToMultiByte函數

8.對於UNICODE和_UNICODE,要麼都定義,要麼都不要用,因爲VS會在我們創建項目的時候默認定義_UNICODE。

9.使用安全的字符串函數,如後綴爲_s的函數或是前綴爲StringCch的函數,後者會截斷字符串。前者需指定字符串長度。

10.使用/GS 和/RTCS編譯器選項來自動檢測緩衝區溢出。

使用UNICODE編碼規範是一種好的編程習慣,但是,有的時候,我們不得不使用ANSI編碼方式,這種情況該如何處理呢?

請看下集UNICODE和ANSI字符串的轉換

 

同系列文章參看:

UNICODE和ANSI字符串的轉換

 

《 讓你的程序更加適用——使用ANSI和UNICODE導出函數 》

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