【Windows學習】Windows核心編程-字符編碼

Windows的字符編碼主要有以下幾個注意點

1.Windows Vista 中每個Unicode字符都是 UTF-16編碼, 且是默認編碼。.Net Framework始終使用UTF-16來編碼。

    開發Windows程序中,如果需要本機代碼和託管代碼之間傳遞字符或字符串,使用UTF-16可以改進性能減少內存消耗

2.C語言中char數據類型表示一個8位的ANSI字符,

  Microsoft C/C++ 編譯器又定義了一個內建的數據類型wchar_t表示16位的Unicode字符

  Windows團隊又爲了區分自己定義的數據類型,在WinNT.h中定義了 typedef char CHAR; typedef wchar_t WCHAR

3.Windows版本里面的參數列表含有字符串的時候分2個版本末尾帶有大寫W表示接受Unicode字符串,末尾帶有A的表示接受

  ANSI字符串,而接受ANSI字符串的API其實只是一個轉換層,負責分配內存,將ANSI字符串轉換成Unicode字符串,然後代碼

 調用Unicode字符串的API,返回的時候,ANSI會釋放它的內存緩衝區,Unicode字符串轉換成非Unicode的形式返回回來,

 因此速度比較慢,消耗內存。

4.同樣C運行庫也提供了一系列函數處理ANSI字符串和Unicode字符串,但是ANSI字符串操作的時候不用轉換成Unicode字符串

5.推薦使用的字符和字符串處理方式

  •  通用數據類型TCHAR/PTSTR表示文本字符和字符串,並且PSTR換成PTSTR
  •  明確數據類型BYTE/PBYTE來表示字節,指針和數據緩衝區
  •  TEXT/_T表示字面量字符和字符牀,避免兩者混用
  •  函數希望傳給它的是緩衝區的字符數,而不是字節數的時候用_countof(szBuffer)而不是sizeof(szBuffer)
  •  爲一個字符串分配內存塊,知道字符串的字符數,但是是以字節來分配,必須調用malloc(nCharacters*sizeof(TCHAR))
  •  避免使用printf系列函數,尤其不要用%s %S來進行ANSI和Unicode的轉換,正確的方式是MultiByteToWideChar(ANSI->Unicode),WideCharToMultiByte
  •  UNICODE _UNICODE符號要同時指定或同時不指定。
  •  字符串拷貝等處理函數,最好使用帶有_s的安全函數
  •  不用Kernel32的方法進行字符串處理比如lstrcat lstrcpy
  •  用戶程序中比較兩種字符串用CompareStringOridinal進行比較。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章