MultiByteToWideChar和WideCharToMultiByte
文章目錄
- MultiByteToWideChar
- 函數功能:
- 函數原型:
- 第一個參數:
- 第二個參數:
- 第三個參數
- 第四個參數
- 第五個參數
- 第六個參數(重頭戲)
- 返回值:
- 補充
- WideCharToMultiByte
- 函數功能:
- 函數原型:
- 第一個參數:
- 第二個參數:
- 第三個參數
- 第四個參數
- 第五個參數
- 第六個參數
- 第七個和第八個參數
- 返回值:
- 實現代碼:
- 總結:
MultiByteToWideChar
MultiByteToWideChar(CP_ACP,0, sText, -1, NULL, 0) MultiByteToWideChar(CP_ACP, 0, sText, -1, pwText, dwNum)函數功能:
該函數映射一個字符串到一個寬字符(unicode)的字符串。由該函數映射的字符串沒必要是多字節字符組。
函數原型:
int MultiByteToWideChar(UINT CodePage,DWORD dwFlags,LPCSTR lpMultiByteStr,int cchMultiByte,LPWSTR lpWideCharStr,int cchWideChar);補充:如果ANSI代碼頁允許在不同的計算機上不相同,甚至在單臺計算機上不一樣,將會導致數據崩潰。為了代碼頁一致性,應用程序應該使用Unicode編碼,如UTF-8或者UTF-16,而不是使用特殊的代碼頁,除了早期標準或者數據格式化不允許使用Unicode編碼。在特殊情況下,有些函數不允許使用Unicode編碼,應用程序應在協議允許的情況下在數據流中用合適的編碼名稱標識。在HTML、XML、HTTP等文件中都允許標識,但TEXT文本不允許這樣做
第一個參數:
指定執行轉換的字符集,這個參數可以為系統已安裝或有效的任何字符集所給定的值。你也可以指定其為下面的任意一值(說白了也就一堆宏定義):
- CP_ACP:ANSI字符集;
- CP_MACCP:Macintosh代碼頁;
- CP_OEMCP:OEM代碼頁;
- CP_SYMBOL:符號字符集(42) ;
- CP_THREAD_ACP:當前線程ANSI代碼頁;
- CP_UTF7:使用UTF-7轉換;
- CP_UTF8:使用UTF-8轉換。
第二個參數:
一個控制標志,一般不需要。一組未標記用以指出是否未轉換成預作或寬字符(若組合形式存在),是否使用象形文字替代控制字符,以及如何處理無效字符。你可以指定下面是標記常量的組合,含義如下:
-
MB_PRECOMPOSED:通常使用預作字符——就是說,由一個基本字符和一個非空字符組成的字符只有一個單一的字符值。這是缺省的轉換選擇。不能與
MB_COMPOSITE值一起使用。
MB_COMPOSITE:通常使用組合字符——就是說,由一個基本字符和一個非空字符組成的字符分別有不同的字符值。不能與MB_PRECOMPOSED值一起使用。
MB_ERR_INVALID_CHARS:如果函數遇到無效的輸入字符,它將運行失敗,且GetLastErro返回ERROR_NO_UNICODE_TRANSLATION值。
MB_USEGLYPHCHARS:使用象形文字替代控制字符。
組合字符由一個基礎字符和一個非空字符構成,每一個都有不同的字符值。每個預作字符都有單一的字符值給基礎/非空字符的組成。在字符è中,e就是基礎字符,而重音符標記就是非空字符。
函數的缺省動作是轉換成預作的形式。如果預作的形式不存在,函數將嘗試轉換成組合形式。
標記MB_PRECOMPOSED和MB_COMPOSITE是互斥的,而標記MB_USEGLYPHCHARS和MB_ERR_INVALID_CHARS則不管其它標記如何都可以設置。
第三個參數
指向將被轉換字符串的字符。
第四個參數
指定由參數lpMultiByteStr指向的字符串中字節的個數(\0之前的字符數)。如果lpMultiByteStr指定的字符串以空字符終止,可以設置為-1(如果字符串不是以空字符中止,設置為-1可能失敗,可能成功),此參數設置為0函數將失敗。
第五個參數
指向接收被轉換字符串的緩沖區。
第六個參數(重頭戲)
指定由參數lpWideCharStr指向的緩沖區的寬字符個數。若此值為零,函數返回緩沖區所必需的寬字符數,在這種情況下,lpWideCharStr中的緩沖區不被使用,即設為0。
返回值:
如果函數運行成功,并且cchWideChar不為零,返回值是由lpWideCharStr指向的緩沖區中寫入的寬字符數;如果函數運行成功,并且cchWideChar為零,返回值是接收到待轉換字符串的緩沖區所需求的寬字符數大小。如果函數運行失敗,返回值為零。若想獲得更多錯誤信息,請調用GetLastError函數
代碼實現:
#include <iostream> #include<Windows.h> #include<locale.h> int main() {setlocale(LC_ALL, "");DWORD dwNum;char sText[] = "多字節字符串轉為寬字符串";dwNum = MultiByteToWideChar(CP_ACP,0, sText, -1, NULL, 0);wchar_t* pwText;pwText = new wchar_t[dwNum];if (!pwText){delete[] pwText;return 1;}MultiByteToWideChar(CP_ACP, 0, sText, -1, pwText, dwNum);wprintf(L"%s\n", pwText);}補充
指針lpMultiByteStr和lpWideCharStr必須不一樣。如果一樣,函數將失敗,GetLastError將返回ERROR_INVALID_PARAMETER的值。
如果MB_ERR_INVALID_CHARS被設置并且在資源字符串中遇到無效的字符時,函數將失敗。如果MB_ERR_INVALID_CHARS不被設置,或是DBCS串中發現了頭字節而沒有有效的尾字節,無效字符將轉換為缺省字符,但不是資源字符串中的缺省字符。當無效字符被發現,且MB_ERR_INVALID_CHARS值被設置,函數返回零,GetLastErro顯示ERROR_NO_UNICODE_TRANSLATION的出錯信息。
如果cbhMultiByte為-1,需要注意返回值為包括零字符在內的字符串的總長度比求字符長度函數得到的返回值大1。
WideCharToMultiByte
WideCharToMultiByte(CP_OEMCP, 0, wTest, -1, NULL, 0, NULL, NULL); WideCharToMultiByte(CP_OEMCP, 0, wTest, -1, psText, dwNum, NULL, NULL);函數功能:
WideCharToMultiByte是一個函數,該函數可以映射一個unicode字符串到一個多字節字符串,執行轉換的代碼頁、接收轉換字符串、允許額外的控制等操作。
函數原型:
int WideCharToMultiByte(UINTCodePage, //指定執行轉換的代碼頁DWORDdwFlags, //允許你進行額外的控制,它會影響使用了讀音符號(比如重音)的字符LPCWSTRlpWideCharStr, //指定要轉換為寬字節字符串的緩沖區intcchWideChar, //指定由參數lpWideCharStr指向的緩沖區的字符個數LPSTRlpMultiByteStr, //指向接收被轉換字符串的緩沖區intcchMultiByte, //指定由參數lpMultiByteStr指向的緩沖區最大值LPCSTRlpDefaultChar, //遇到一個不能轉換的寬字符,函數便會使用pDefaultChar參數指向的字符LPBOOLpfUsedDefaultChar//至少有一個字符不能轉換為其多字節形式,函數就會把這個變量設為TRUE);第一個參數:
CodePage:指定執行轉換的代碼頁,這個參數可以為系統已安裝或有效的任何代碼頁所給定的值。你也可以指定其為下面的任意一值:
- CP_ACP:ANSI代碼頁;
- CP_MACCP:Macintosh代碼頁;
- CP_OEMCP:OEM代碼頁;
- CP_SYMBOL:符號代碼頁(42);
- CP_THREAD_ACP:當前線程ANSI代碼頁;
- CP_UTF7:使用UTF-7轉換;
- CP_UTF8:使用UTF-8轉換。
第二個參數:
一個控制標志,一般不需要。一組未標記用以指出是否未轉換成預作或寬字符(若組合形式存在),是否使用象形文字替代控制字符,以及如何處理無效字符。你可以指定下面是標記常量的組合,含義如下:
-
MB_PRECOMPOSED:通常使用預作字符——就是說,由一個基本字符和一個非空字符組成的字符只有一個單一的字符值。這是缺省的轉換選擇。不能與
MB_COMPOSITE值一起使用。
MB_COMPOSITE:通常使用組合字符——就是說,由一個基本字符和一個非空字符組成的字符分別有不同的字符值。不能與MB_PRECOMPOSED值一起使用。
MB_ERR_INVALID_CHARS:如果函數遇到無效的輸入字符,它將運行失敗,且GetLastErro返回ERROR_NO_UNICODE_TRANSLATION值。
MB_USEGLYPHCHARS:使用象形文字替代控制字符。
組合字符由一個基礎字符和一個非空字符構成,每一個都有不同的字符值。每個預作字符都有單一的字符值給基礎/非空字符的組成。在字符è中,e就是基礎字符,而重音符標記就是非空字符。
函數的缺省動作是轉換成預作的形式。如果預作的形式不存在,函數將嘗試轉換成組合形式。
標記MB_PRECOMPOSED和MB_COMPOSITE是互斥的,而標記MB_USEGLYPHCHARS和MB_ERR_INVALID_CHARS則不管其它標記如何都可以設置。
第三個參數
指向將被轉換的unicode字符串。
第四個參數
指定由參數lpWideCharStr指向的緩沖區的字符個數。如果這個值為-1,字符串將被設定為以NULL為結束符的字符串,并且自動計算長度。
第五個參數
指向接收被轉換字符串的緩沖區。
第六個參數
指定由參數lpMultiByteStr指向的緩沖區最大值(用字節來計量)。若此值為零,函數返回lpMultiByteStr指向的目標緩沖區所必需的字節數,在這種情況下,lpMultiByteStr參數通常為NULL。
第七個和第八個參數
只有當WideCharToMultiByte函數遇到一個寬字節字符,而該字符在uCodePage參數標識的代碼頁中并沒有它的表示法時,WideCharToMultiByte函數才使用這兩個參數。如果寬字節字符不能被轉換,該函數便使用lpDefaultChar參數指向的字符。如果該參數是NULL(這是大多數情況下的參數值),那么該函數使用系統的默認字符。該默認字符通常是個問號。這對于文件名來說是危險的,因為問號是個通配符。pfUsedDefaultChar參數指向一個布爾變量,如果Unicode字符串中至少有一個字符不能轉換成等價多字節字符,那么函數就將該變量置為TRUE。如果所有字符均被成功地轉換,那么該函數就將該變量置為FALSE。當函數返回以便檢查寬字節字符串是否被成功地轉換后,可以測試該變量。
返回值:
如果函數運行成功,并且cchMultiByte不為零,返回值是由 lpMultiByteStr指向的緩沖區中寫入的字節數;如果函數運行成功,并且cchMultiByte為零,返回值是接收到待轉換字符串的緩沖區所必需的字節數。如果函數運行失敗,返回值為零。若想獲得更多錯誤信息,請調用GetLastError函數
實現代碼:
wchar_t wTest[] = L"寬字符串轉為多字節字符串";dwNum = WideCharToMultiByte(CP_OEMCP, 0, wTest, -1, NULL, 0, NULL, NULL);char* psText;psText = new char[dwNum];if (!psText){delete[] psText;return 1;}WideCharToMultiByte(CP_OEMCP, 0, wTest, -1, psText, dwNum, NULL, NULL);printf("%s\n", psText);總結:
其實,MultiByteToWideChar和WideCharToMultiByte函數參數差不多,只是后者多了兩個參數而已,可以對比記憶和使用
備注:
2021年堅持學寫博客第6天(學習兩個windows API) 尋夢SS
明日目標:
windows核心編程API函數
總結
以上是生活随笔為你收集整理的MultiByteToWideChar和WideCharToMultiByte的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: printf()详解
- 下一篇: GetLogicalDriveStrin