回爐重造之重讀Windows核心編程-002-字符集

  使用Unicode的優點:數組

  • 便於在不一樣語言之間進行數據交換。
  • 讓你的exe或者dll文件支持全部的語言。
  • 提升應用程序的執行效率

  Windows2000是使用Unicode從新開發的,核心部分都須要Unicode字符串。因此:緩存

  • 參數中傳入一個ANSI字符串,那麼系統就要先把這個ANSI字符串轉換成Unicode,而後將Unicode字符串傳給系統;
  • 返回值是一個ANSI字符串,那麼系統首先要把Unicode轉成ANSI,才能返回給應用程序。

  這些操做必需要分配內存,調用函數,都是在你看不到的狀況下發生的。所以直接使用Unicode,可讓你的應用程序更加高效率地運行。ide

  C語言對Unicode的支持是wchar_t。在VS中則是定義UINICODE和_UNICODE。函數

  ANSI改爲Unicode字符串有三種方式,字符串前加一個L、使用TEXT宏和_T宏。spa

  若是是使用的DLL和調用它的EXE,分別使用Ansi版本和Unicode版本,只須要分配內存,而後轉換就能夠調用了。指針

  對於功能相同的兩個函數,儘可能使用Unicode的版本。code

  ShlWApi.h頭文件中,也提供了操做字符串的Ansi和Unicode版本。內存

  轉換你的應用程序到Unicode版本的一些基本原則:ci

  • 將文本視爲字符串,而不是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()的返回值,它返回當前語言的設置;
  • 第二個參數用於標識一些標誌,用於比較字符串時的方式。使用lstrcmplstrcmpi的話,默認值是不同的。

  其餘的C運行時函數爲了支持Unicode的版本,例如CharLowerCharUpperCharLowerBuffCharUpperBuffIsCharAlphaisAlphaNumber

  最後一個是printf函數家族,有char版本的sprintfswprintf

  資源內的字符串們,會使用Unicode,不是也被系統內部轉換。

  肯定字符串是Ansi仍是Unicode,可使用函數IsTextUnicode區分,儘管它有可能返回不正確的結果

  在Unicode和Ansi之間轉換字符串,使用兩個函數MultiByteToWideCharWideCharToMultiByte

相關文章
相關標籤/搜索