字符串及處理之 使用TCHAR方案 Windows自帶的字符串函

使用TCHAR系列方案編寫程序
  TCHAR是一種字符串類型,它讓你在以MBCS和UNNICODE來build程序時可以使用同樣的代碼,不需要使用繁瑣的宏定義來包含你的代碼。
      TCHAR的引入,主要是在Tchar.h文件中,該文件包含這方面的重要的定義信息。
      對於包含了對str函數或wcs函數進行顯式調用的代碼來說,無法非常容易地同時爲ANSI和Unicode對這些代碼進行編譯。本章前面說過,可以創建同時爲ANSI和Unicode進行編譯的單個源代碼文件。若要建立雙重功能,必須包含TChar.h文件,而不是包含String.h文件。
      TChar.h文件的唯一作用是幫助創建ANSI/Unicode通用源代碼文件。它包含你應該用在源代碼中的一組宏,而不應該直接調用str函數或者wcs函數。如果在編譯源代碼文件時定義了_UNICODE,這些宏就會引用wcs這組函數。如果沒有定義_UNICODE,那麼這些宏將引用str這組宏。


      TCHAR的定義如下:
      #ifdef UNICODE
      typedef wchar_t TCHAR;
      #else
      typedef char TCHAR;
      #endif
      所以用MBCS來build時,TCHAR是char,使用UNICODE時,TCHAR是wchar_t。
      還有一個宏來處理定義Unicode字符串常量時所需的L前綴。
      #ifdef UNICODE
      #define _T(x) L##x
      #define _TEXT(x) L##x
      #define __T(x) L##x
      #else
      #define _T(x) x
      #define _TEXT(x) x
      #define __T(x) x
      #endif


      ## 是一個預處理操作符,它可以把兩個參數連在一起。如果你的代碼中需要字符串常量,在它前面加上_T宏。如果你使用Unicode來build,它會在字符串常量前加上L前綴。
      TCHAR szNewText[] = _T("we love Bob!");

      _UNICODE宏用於C運行期頭文件,而UNICODE宏則用於Windows頭文件。當編譯源代碼模塊時,通常必須同時定義這兩個宏。

  像是用宏來隱藏SetWindowTextA/W的細節一樣,還有很多可以供你使用的宏來實現str***()和_mbs***()等字符串函數。例如,你可以使用_tcsrchr宏來替換strrchr()、_mbsrchr()和wcsrchr()。_tcsrchr根據你預定義的宏是_MBCS還是UNICODE來擴展成正確的函數,就象SetWindowText所作的一樣。


  不僅str***()函數有TCHAR宏。其他的函數如, _stprintf(代替sprinft()和swprintf()),_tfopen(代替fopen()和_wfopen())。 MSDN中"Generic-Text Routine Mappings."標題下有完整的宏列表。

 

 

 

 

Windows字符串函數
      Windows還提供了一組範圍很廣的字符串操作函數。這些函數與C運行期字符串函數(如strcpy和wcscpy)很相似。但是該操作系統函數是操作系統的一個組成部分,操作系統的許多組件都使用這些函數,而不使用C運行期庫。建議最好使用操作系統函數,而不要使用C運行期字符串函數。這將有助於稍稍提高你的應用程序的運行性能,因爲操作系統字符串函數常常被大型應用程序比如操作系統的外殼進程Explorer.exe所使用。由於這些函數使用得很多,因此,在你的應用程序運行時,它們可能已經被裝入RAM。
      若要使用這些函數,系統必須運行Windows 2000或Windows 98。如果安裝了Internet Explorer 4.0或更新的版本,也可以在較早的Windows版本中獲得這些函數。
      在經典的操作系統函數樣式中,操作系統字符串函數名既包含大寫字母,也包含小寫字母,它的形式類似這個樣子:StrCat、StrChr、StrCmp和StrCpy等。若要使用這些函數,必須加上ShlWApi.h頭文件。另外,如前所述,這些字符串函數既有ANSI版本,也有Unicode版本,例如StrCatA 和StrCatW。由於這些函數屬於操作系統函數,因此,當創建應用程序時,如果定義了UNICODE(不帶前置下劃線),那麼它們的符號將擴展爲寬字符版本。

      Windows也提供了一組用於對Unicode字符串進行操作的函數,表2 - 4對它們進行了描述。
      表2-4 對Unicode字符串進行操作的函數
      函數描述
      lstrcat 將一個字符串置於另一個字符串的結尾處
      lstrcmp 對兩個字符串進行區分大小寫的比較
      lstrcmpi 對兩個字符串進行不區分大小寫的比較
      lstrcpy 將一個字符串拷貝到內存中的另一個位置
      lstrlen 返回字符串的長度(按字符數來計量)

      這些函數是作爲宏來實現的,這些宏既可以調用函數的Unicode版本,也可以調用函數的ANSI版本,這要根據編譯源代碼模塊時是否已經定義了UNICODE而定。例如,如果沒有定義UNICODE,lstrcat函數將擴展爲lstrcatA。如果定義了UNICODE,lstrcat將擴展爲lstrcatW。
     

在windows環境下操作DBCS:
      如果只是調用strlen函數,那麼你無法真正瞭解字符串中究竟有多少字符,它只能告訴你到達結尾的0之前有多少個字節。ANSI的C運行期庫中沒有配備相應的函數,使你能夠對雙字節字符集進行操作。但是,Microsoft Visual C++的運行期庫卻包含許多函數,如_mbslen ,它可以用來操作多字節(既包括單字節也包括雙字節)字符串。
      爲了幫助你對DBCS字符串進行操作,Windows提供了下面的一組幫助函數(見表2 - 1 )。前兩個函數CharNext 和CharPrev 允許前向或逆向遍歷DBCS字符串,方法是每次一個字符。第三個函數IsDBCSLeadByte, 在字節返回到一個兩字字節符的第一個字節時將返回TRUE。
      表2-1 對DBCS字符串進行操作的幫助函數
      PTSTR CharNext(PCTSTR pszCurrentChar);                   
            返回字符串中的下一個字符的地址
      PTSTR CharPrev(PCTSTR pszStart,PCTSTR pszCurrentChar );  
            返回字符串中的上一個字符的地址
      BOOL IsDBCSLeadByteTRUE(BYTE bTestChar);                  
            如果該字節是DBCS字符的第一個字節,則返回

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章