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進行比較。