C++ WideCharToMultiByte()函數(shù)案例詳解
函數(shù)WideCharToMultiByte() 詳解
函數(shù)原型:
int WideCharToMultiByte( UINT CodePage, DWORD dwFlags, LPWSTR lpWideCharStr, int cchWideChar, LPCSTR lpMultiByteStr, int cchMultiByte, LPCSTR lpDefaultChar, PBOOL pfUsedDefaultChar );
函數(shù)功能:
此函數(shù)把寬字符串轉(zhuǎn)換成指定的新的字符串,如ANSI,UTF8等,新字符串不必是多字節(jié)字符集。
(—Unicode 轉(zhuǎn) ANSI(GB2312),UTF8)
參數(shù):
- CodePage:指定執(zhí)行轉(zhuǎn)換的代碼頁,這個參數(shù)可以為系統(tǒng)已安裝或有效的任何代碼頁所給定的值。
CP_ACP | 當(dāng)前系統(tǒng)ANSI代碼頁 |
---|---|
CP_MACCP | 當(dāng)前系統(tǒng)Macintosh代碼頁 |
CP_OEMCP | 當(dāng)前系統(tǒng)OEM代碼頁,一種原始設(shè)備制造商硬件掃描碼 |
CP_SYMBOL | 符號代碼頁(42) |
CP_THREAD_ACP | 當(dāng)前線程ANSI代碼頁 |
- dwFlags:指定如何處理沒有轉(zhuǎn)換的字符,但不設(shè)此參數(shù)函數(shù)會運(yùn)行的更快一些,我都是把它設(shè)為0。
可設(shè)的值如下表所示:
WC_NO_BEST_FIT_CHARS 把不能直接轉(zhuǎn)換成相應(yīng)多字節(jié)字符的Unicode字符轉(zhuǎn)換成lpDefaultChar指定的默認(rèn)字符。也就是說,如果把Unicode轉(zhuǎn)換成多字節(jié)字符,然后再轉(zhuǎn)換回來,你并不一定得到相同的Unicode字符,因?yàn)檫@期間可能使用了默認(rèn)字符。此選項(xiàng)可以單獨(dú)使用,也可以和其他選項(xiàng)一起使用。 WC_COMPOSITECHECK 把合成字符轉(zhuǎn)換成預(yù)制的字符。它可以與后三個選項(xiàng)中的任何一個組合使用,如果沒有與他們中的任何一個組合,則與選項(xiàng)WC_SEPCHARS相同。 WC_ERR_INVALID_CHARS 此選項(xiàng)會致使函數(shù)遇到無效字符時失敗返回,并且GetLastError會返回錯誤碼ERROR_NO_UNICODE_TRANSLATION。否則函數(shù)會自動丟棄非法字符。此選項(xiàng)只能用于UTF8。 WC_DISCARDNS 轉(zhuǎn)換時丟棄不占空間的字符,與WC_COMPOSITECHECK 一起使用 WC_SEPCHARS 轉(zhuǎn)換時產(chǎn)生單獨(dú)的字符,此是默認(rèn)轉(zhuǎn)換選項(xiàng),WC_COMPOSITECHECK一起使用 WC_DEFAULTCHAR 轉(zhuǎn)換時使用默認(rèn)字符代替例外的字符,(最常見的如'?'),與WC_COMPOSITECHECK一起使用。
- lpWideCharStr: 待轉(zhuǎn)換的寬字符串。
- cchWideChar: 待轉(zhuǎn)換寬字符串的長度,-1表示轉(zhuǎn)換到字符串結(jié)尾。
- lpMultiByteStr: 接收轉(zhuǎn)換后輸出新串的緩沖區(qū)。
- cbMultiByte: 輸出緩沖區(qū)大小,如果為0,lpMultiByteStr將被忽略,函數(shù)將返回所需緩沖區(qū)大小而不使用lpMultiByteStr。
- lpDefaultChar: 指向字符的指針, 在指定編碼里找不到相應(yīng)字符時使用此字符作為默認(rèn)字符代替。如果為NULL則使用系統(tǒng)默認(rèn)字符。對于要求此參數(shù)為NULL的dwFlags而使用此參數(shù),函數(shù)將失敗返回并設(shè)置錯誤碼ERROR_INVALID_PARAMETER。
- lpUsedDefaultChar: 開關(guān)變量的指針,用以表明是否使用過默認(rèn)字符。對于要求此參數(shù)為NULL的dwFlags而使用此參數(shù),函數(shù)將失敗返回并設(shè)置錯誤碼ERROR_INVALID_PARAMETER。lpDefaultChar和lpUsedDefaultChar都設(shè)為NULL,函數(shù)會更快一些。
- 返回值: 如果函數(shù)成功,且cbMultiByte非0,返回寫入lpMultiByteStr的字節(jié)數(shù)(包括字符串結(jié)尾的null);cbMultiByte為0,則返回轉(zhuǎn)換所需字節(jié)數(shù)。函數(shù)失敗,返回0。
注意: 函數(shù)WideCharToMultiByte使用不當(dāng),會給影響程序的安全。調(diào)用此函數(shù)會很容易導(dǎo)致內(nèi)存泄漏,因?yàn)閘pWideCharStr指向的輸入緩沖區(qū)大小是寬字符數(shù),而lpMultiByteStr指向的輸出緩沖區(qū)大小是字節(jié)數(shù)。為了避免內(nèi)存泄漏,應(yīng)確保為輸出緩沖區(qū)指定合適的大小。我的方法是先使cbMultiByte為0調(diào)用WideCharToMultiByte一次以獲得所需緩沖區(qū)大小,為緩沖區(qū)分配空間,然后再次調(diào)用WideCharToMultiByte填充緩沖區(qū),詳見下面的代碼。另外,從Unicode UTF16向非Unicode字符集轉(zhuǎn)換可能會導(dǎo)致數(shù)據(jù)丟失,因?yàn)樵撟址赡軣o法找到表示特定Unicode數(shù)據(jù)的字符。
demo1
wchar_t* pwszUnicode = L"Holle, word! 你好,中國! "; int iSize; char* pszMultiByte; iSize = WideCharToMultiByte(CP_ACP, 0, pwszUnicode, -1, NULL, 0, NULL, NULL); pszMultiByte = (char*)malloc(iSize*sizeof(char)); WideCharToMultiByte(CP_ACP, 0, pwszUnicode, -1, pszMultiByte, iSize, NULL, NULL);
demo2
int n; CString noUser = _T("我是demo2"); //獲得所需緩沖區(qū)大小n,為緩沖區(qū)分配空間 n = WideCharToMultiByte(CP_OEMCP, 0, noUser, -1, NULL, 0, 0, FALSE); //m_strNoUser:接收轉(zhuǎn)換后輸出新串的緩沖區(qū)。 m_strNoUser = new char[n]; memset(m_strNoUser, 0, n*sizeof(char)); WideCharToMultiByte(CP_OEMCP, 0, noUser.GetBuffer(0), n, m_strNoUser, n , 0, FALSE);
到此這篇關(guān)于C++ WideCharToMultiByte()函數(shù)案例詳解的文章就介紹到這了,更多相關(guān)C++ WideCharToMultiByte()函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
VC++ 字符串String MD5計(jì)算小工具 VS2008工程
基于字符串加密的MD5算法,VS2008 VC++,多字節(jié)編譯工程。主要代碼如下,實(shí)現(xiàn)了ANSI字符串加密與Unicode字符串加密,需要的朋友可以參考下2017-07-07C++數(shù)據(jù)結(jié)構(gòu)與算法之反轉(zhuǎn)鏈表的方法詳解
這篇文章主要介紹了C++數(shù)據(jù)結(jié)構(gòu)與算法之反轉(zhuǎn)鏈表的方法,結(jié)合實(shí)例形式分析了C++反轉(zhuǎn)鏈表的原理、實(shí)現(xiàn)方法及相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-08-08在Visual Studio中用C++語言創(chuàng)建DLL動態(tài)鏈接庫圖文教程
這篇文章主要介紹了在Visual Studio中用C++語言創(chuàng)建DLL動態(tài)鏈接庫圖文教程,本文詳細(xì)講解了DLL庫的創(chuàng)建過程,并給出了代碼示例,需要的朋友可以參考下2014-09-09C語言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
這篇文章主要介紹了C語言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例,并且轉(zhuǎn)換后會統(tǒng)計(jì)二進(jìn)制1的個數(shù),實(shí)例簡單明了,需要的朋友可以參考下2014-06-06C語言實(shí)現(xiàn)三子棋小游戲(vs2013多文件)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)三子棋小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-06-06