windows字符和字符串處理

windows字符和字符串處理

Windows定義的Unicode數據類型有:

  WCHAR                     Unicode字符

  PWSTR                     指向Unicode字符串的指針

  PCWSTR                    指向一個恆定的Unicode字符串的指針

相對應的ANSI數據類型有:

  CHAR                      ANSI字符

  PSTR                     指向ANSI字符串的指針

  PCSTR                    指向一個恆定的ANSI字符串的指針

通用的字符數據類型:

  TCHAR              記憶方法:T--對應_T()宏   P--Point,指針  STR--string

  PTSTR     

  PCTSTR

其中TCHAR的定義位於類TChar.h中,需要定義宏_UNICODE才能調用unicode數據類型。 PTSTR,PCTST的定義位於 Windows.h頭文件中,需要定義宏UNICODE才能調用unicode數據類型。因此當同時調用windows.h和TChar.h文件且需要用 到unicode編碼時,需要同時定義宏_UNICODE和宏UNICODE。

 

注:

1.爲了程序的兼容性,一般調用通用字符類型。並且建議最好使用操作系統函數,而不要使用C運行期字符串函數。這將有助於稍稍提高你的應用程序的運行性能。

2.當將字符串地址附值給TCHAR指針變量時需要的格式爲

TCHAR* pszError = _TEXT("error");

因爲如果不加_TEXT,默認"error"爲ANSI編碼.

3. 當爲用戶提供dll鏈接庫時需要定義一套既適合unicode又適合ANSI的代碼。一般是在ANSI的函數中將ANSI的參數轉換爲UNICODE的參 數再調用UNICODE的函數。如windows提供的函數CreateWindowExA和CreateWindowExW。另外Windows還定義 了一個宏CreateWindowEx,其定義如下:

#ifdef unicode

#define CreateWindowEx CreateWindowExW

#else

#define CreateWindowEx CreateWindowExA

#endif

4. 當計算字符個數時應該調用sizeof(szBuffer)/sizeof(TCHAR),而不是sizeof(szBuffer),分配內存時應該調用 malloc(nCharacters *sizeof(TCHAR)), 而不是調用malloc(nCharacters )。

5._countof宏可獲得字符串的字符數,sizeof可獲得字符串的字節數。

1. 爲了兼容性可以調用以下函數來處理字符:

  lstrcat 將一個字符串置於另一個字符串的結尾處
     lstrcmp 對兩個字符串進行區分大小寫的比較
     lstrcmpi 對兩個字符串進行不區分大小寫的比較
     lstrcpy 將一個字符串拷貝到內存中的另一個位置
     lstrlen 返回字符串的長度(按字符數來計量)

PTSTR CharLower(PTSTR pszString)  將字符或者字符串轉換成小寫

PTSTR CharUpper(PTSTR pszString)  將字符或者字符串轉換成大寫

DWORD CharLowerBuff(PTSTR pszString,DWORD cchString)  將字符緩衝區中的字符轉換成小寫

DWORD CharUpperBuff(PTSTR pszString,DWORD cchString)  將字符緩衝區中的字符轉換成大寫

BOOL IsCharAlpha(TCHAR ch);  判斷一個字符是否在ASCII表中

BOOL IsCharAlphaNumeric(TCHAR ch)  判斷一個字符是否是數字

BOOL IsCharLower(TCHAR ch)  判斷字符是否是小寫

BOOL IsCharUpper(TCHAR ch) 判斷字符是否是大寫

sprintf(PTSTR, PTSTR, PTSTR)

注: (1).CharLower,CharUpper,CharLowerBuff,CharUpperBuff這幾個函數還可以用來處理一個字符,方法如下:TCHAR cLowerCaseChar= CharLower((PTSTR)szString[0])

     (2).CharUpper 和CharUpperBuff的區別是charUpperBuff用於處理字符緩衝區的數據(緩衝區不必以0結尾)

     

2其他函數:

DWORD IsTextUnicode(CONST PVOID pvBuffer,int cb, PINT pResult);(此函數用於判斷文本文件的編碼類型)

int WideCharToMultiByte(UINT uCodePage, DWORD dwFlags,PCWSTR pWideCharStr,

    int cchWideChar,PSTR pMultiByteStr,int cchMultiByte,PCSTR  pDefaultChar,PBOOL pfUDC)  //寬字節到多字節轉換

int MultiByteToWideChar(UINT uCodePage, DWORD dwFlags,PSTR pMultiByteStr, //多字節到寬字節轉換

    int cchMultiByte,,PCWSTR pWideCharStr,int cchWideChar)

函數MultiByteToWideChar的使用方法:

    1) 調用MultiByteToWideChar函數,爲pWideCharStr參數傳遞NULL,爲cchWideChar參數傳遞0。
    2) 分配足夠的內存塊,用於存放轉換後的Unicode字符串。該內存塊的大小由前面對MultiByteToWideChar的調用返回。
    3) 再次調用MultiByteToWideChar,這次將緩存的地址作爲pWideCharStr參數來傳遞,並傳遞第一次調用MultiByteToWideChar時返回的        緩存大小,作爲cchWideChar參數。
    4) 使用轉換後的字符串。
    5) 釋放Unicode字符串佔用的內存塊。

3.安全字符串函數

C運行庫中現有的字符串處理函數(如_tcscpy宏後面的那些函數)已被標記廢棄不用。如果使用了這些函數,編譯器就會發出警告。

取而代之的是安全字符串函數,例如:

errno_t strcpy_s( char *strDestination, size_t numberOfElements, const char *strSource );

errno_t strcat_s( char *strDestination, size_t numberOfElements, const char *strSource );

這些安全的字符串函數在將一個可寫的緩衝區作爲參數傳遞時,必須同時提供他的大小。這個值應該是一個字符數。通過對緩衝區使用_countof宏(在stdlib.h中定義),我們很容易計算出這個值。

ps:1.使用上面這些安全的字符串函數的時候必須包含頭文件StrSafe.h。同時String.h也會自動被包含進來。

    2.必須包含其他所有文件之後才包含StrSafe.h。

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