Unicode 和ANSI字符串轉換(引用自Windows內核編程(第五版 ))

     在日常的編程中我們經常會遇到使用別人封裝好的庫,但是他們的庫關於字符串的操作很多是基於ANSI來封裝的,這就造成了我們在創建 的Unicode的工程在使用的時候有很多不方便,如果沒有這些庫的源碼來做修改的情況下,我們只能考慮Unicode 和ANSI字符串轉換相互轉換來滿足自己特殊情況的應用;

   廢話少說,下面直接介紹Unicode 和ANSI字符串轉換的方法:

1.多字節 字符串轉換爲寬字符 字符串(MultiByteToWideChar)

         MultiByteToWideChar的函數原型如下:

          int MultiByteToWideChar(
    UINT CodePage,
    DWORD dwFlags,
    LPCSTR lpMultiByteStr,
    int cchMultiByte,
    LPWSTR lpWideCharStr,
    int cchWideChar);

        轉換的步驟爲:

        使用的一般步驟如下:
  MultiByteToWideChar:
  1)調用MultiByteToWideChar,爲lpWideCharStr參數傳入NULL,爲cchWideChar參數傳入0,爲cchMultiByte參數傳入-1;
  2)分配一塊足夠容納轉換後Unicode字符串的內存,它的大小是上一個MultiByteToWideChar調用的返回值乘以sizeof(wchar_t);
  3)再次調用MultiByteToWideChar,這一次將緩衝區地址作爲lpWideCharStr參數的值傳入,將第一次MultiByteToWideChar調用的返回值乘以sizeof(wchar_t) 後得到的大小的作爲cchWideChar參數的值傳入;
  4)使用轉換後的字符串;
  5)釋放Unicode字符串佔用的內存塊。


2.寬字符 字符串 轉換爲 多字節 字符串(WideCharToMultiByte)

       先來看一下WideChatToMultiByte的定義:

         int WideCharToMultiByte(
    UINT CodePage,
    DWORD dwFlags,
    LPWSTR lpWideCharStr,
    int cchWideChar,
    LPCSTR lpMultiByteStr,
    int cchMultiByte,
    LPCSTR lpDefaultChar,
    PBOOL pfUsedDefaultChar );

       這個函數和MultiByteToWideChar的操作步驟是一樣的,唯一的不同就是:返回值直接就是確保轉換成功所需的字節數,所以無需執行乘法運算。

           注意:WideCharToMultiByte比MultiByteToWideChar相比多兩個參數lpDefaultChar和pfUsedDefaultChar,這兩個參數只有在以下情況下才會用到:  當一個字符在uCodePage指定的代碼頁中沒有對應的表示是,纔會用到這兩個參數;

           當遇到一個不能轉換的寬字符時,pDefaultChar指定的字符便被用來替代不能轉換的寬字符的字符;如果pDefault指定爲NULL,函數會使用一個系統默認的字符,一般情況下爲問號,這對文件明來說是比較危險的,因爲問號是一個通配符;

           pfUsedDefaultChar指向一個布爾變量,如果寬字符轉換過程中,有至少一個字符不能轉換爲對應的多字節形式,這個函數會被置爲TRUE,如果全部成功轉換則 返回FALSE;可以用來驗證轉換是否順利完成,當然一般情況下我們也會將該參數直接傳入NULL;

      

 



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