使用Unicode的優勢: 便於在不同語言之間進行數據交換。 讓你的exe或者dll文件支持所有的語言。 提高應用程式的執行效率。 Windows2000是使用Unicode重新開發的,核心部分都需要Unicode字元串。所以: 當參數中傳入一個ANSI字元串,那麼系統就要先把這個ANSI字元串轉換 ...
使用Unicode的優勢:
- 便於在不同語言之間進行數據交換。
- 讓你的exe或者dll文件支持所有的語言。
- 提高應用程式的執行效率。
Windows2000是使用Unicode重新開發的,核心部分都需要Unicode字元串。所以:
- 當參數中傳入一個ANSI字元串,那麼系統就要先把這個ANSI字元串轉換成Unicode,然後將Unicode字元串傳給系統;
- 當返回值是一個ANSI字元串,那麼系統首先要把Unicode轉成ANSI,才能返回給應用程式。
這些操作必須要分配記憶體,調用函數,都是在你看不到的情況下發生的。因此直接使用Unicode,可以讓你的應用程式更加高效率地運行。
C語言對Unicode的支持是wchar_t。在VS中則是定義UINICODE和_UNICODE。
ANSI改成Unicode字元串有三種方式,字元串前加一個L、使用TEXT巨集和_T巨集。
如果是使用的DLL和調用它的EXE,分別使用Ansi版本和Unicode版本,只需要分配記憶體,然後轉換就可以調用了。
對於功能相同的兩個函數,儘量使用Unicode的版本。
ShlWApi.h頭文件中,也提供了操作字元串的Ansi和Unicode版本。
轉換你的應用程式到Unicode版本的一些基本原則:
- 將文本視為字元串,而不是char或者位元組數組
- 對於文本字元串和字元串,使用通用數據類型(TCHAR或者PTSTR)
- 對於位元組、位元組指針和數據緩存,使用顯式數據類型(BYTE,PBYTE)
- 將TEXT巨集用在字元和字元串上。
- 執行全局性替換(例如使用PTSTR替換PSTR)
- 字元串運算問題。使用Unicode版本字元串後,在分配記憶體的時候必須寫sizeof(szBuffer)/sizeof(TCHAR)。這樣的失誤,編譯器不會發出任何警告。
Windows對字元串進行操作的函數:lstrcat、lstrcmp、lstrcmpi、lstrcpy、lstrlen。這些函數是作為巨集實現的。真正比較兩個Unicode字元串的函數是CompareString(LCID lcid, DWORD fdwStyle, PCWSTR pString1, int cch1, PCTSTR pString2, int cch2);
- 第一個參數是函數GetThreadLocale()的返回值,它返回當前語言的設置;
- 第二個參數用於標識一些標誌,用於比較字元串時的方式。使用lstrcmp和lstrcmpi的話,預設值是不一樣的。
其他的C運行時函數為了支持Unicode的版本,例如CharLower、CharUpper、CharLowerBuff、CharUpperBuff、IsCharAlpha、isAlphaNumber。
最後一個是printf函數家族,有char版本的sprintf和swprintf。
資源內的字元串們,會使用Unicode,不是也被系統內部轉換。
確定字元串是Ansi還是Unicode,可以使用函數IsTextUnicode區分,儘管它有可能返回不正確的結果。
在Unicode和Ansi之間轉換字元串,使用兩個函數MultiByteToWideChar和WideCharToMultiByte。