在日常的編程中我們經常會遇到使用別人封裝好的庫,但是他們的庫關於字符串的操作很多是基於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;