1. 程式人生 > >windows字元和字串處理

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。