欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++ WideCharToMultiByte()函數(shù)案例詳解

 更新時間:2021年08月19日 08:50:23   作者:eagle659  
這篇文章主要介紹了C++ WideCharToMultiByte()函數(shù)案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下

函數(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一起使用。
  1. lpWideCharStr: 待轉(zhuǎn)換的寬字符串。
  2. cchWideChar: 待轉(zhuǎn)換寬字符串的長度,-1表示轉(zhuǎn)換到字符串結(jié)尾。
  3. lpMultiByteStr: 接收轉(zhuǎn)換后輸出新串的緩沖區(qū)。
  4. cbMultiByte: 輸出緩沖區(qū)大小,如果為0,lpMultiByteStr將被忽略,函數(shù)將返回所需緩沖區(qū)大小而不使用lpMultiByteStr。
  5. lpDefaultChar: 指向字符的指針, 在指定編碼里找不到相應(yīng)字符時使用此字符作為默認(rèn)字符代替。如果為NULL則使用系統(tǒng)默認(rèn)字符。對于要求此參數(shù)為NULL的dwFlags而使用此參數(shù),函數(shù)將失敗返回并設(shè)置錯誤碼ERROR_INVALID_PARAMETER。
  6. lpUsedDefaultChar: 開關(guān)變量的指針,用以表明是否使用過默認(rèn)字符。對于要求此參數(shù)為NULL的dwFlags而使用此參數(shù),函數(shù)將失敗返回并設(shè)置錯誤碼ERROR_INVALID_PARAMETER。lpDefaultChar和lpUsedDefaultChar都設(shè)為NULL,函數(shù)會更快一些。
  7. 返回值: 如果函數(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)文章

  • 超詳細(xì)的cmake入門教程

    超詳細(xì)的cmake入門教程

    這篇文章主要介紹了超詳細(xì)的cmake入門教程,需要的朋友可以參考下
    2020-02-02
  • VC++ 字符串String MD5計(jì)算小工具 VS2008工程

    VC++ 字符串String MD5計(jì)算小工具 VS2008工程

    基于字符串加密的MD5算法,VS2008 VC++,多字節(jié)編譯工程。主要代碼如下,實(shí)現(xiàn)了ANSI字符串加密與Unicode字符串加密,需要的朋友可以參考下
    2017-07-07
  • C語言文件操作與相關(guān)函數(shù)介紹

    C語言文件操作與相關(guān)函數(shù)介紹

    文件(file)一般指存儲在外部介質(zhì)上數(shù)據(jù)的集合,比如我們經(jīng)常使用的.txt, .bmp, jpg. .exe,.rmvb等等,下面這篇文章主要給大家介紹了關(guān)于C語言文件操作的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • C++數(shù)據(jù)結(jié)構(gòu)與算法之反轉(zhuǎn)鏈表的方法詳解

    C++數(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)鏈接庫圖文教程

    這篇文章主要介紹了在Visual Studio中用C++語言創(chuàng)建DLL動態(tài)鏈接庫圖文教程,本文詳細(xì)講解了DLL庫的創(chuàng)建過程,并給出了代碼示例,需要的朋友可以參考下
    2014-09-09
  • C語言 野指針與空指針專篇解讀

    C語言 野指針與空指針專篇解讀

    全網(wǎng)最接地氣的C語言野指針介紹,此處對于野指針與空指針知識點(diǎn)做一些簡要的介紹,作者實(shí)屬初學(xué),寫博客也是作者學(xué)習(xí)的一個過程,難免文章中有內(nèi)容理解不到位或者有不當(dāng)之處,還請朋友們不吝指正,希望大家多多給予支持,贈人玫瑰,手有余香
    2021-11-11
  • C/C++ 編譯器優(yōu)化介紹

    C/C++ 編譯器優(yōu)化介紹

    這篇文章主要涉及了C/C++ 編譯器優(yōu)化的簡單介紹,具有一定參考價值。如有不對之處,歡迎指出。
    2017-09-09
  • C語言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例

    C語言十進(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-06
  • C語言函數(shù)棧幀詳解

    C語言函數(shù)棧幀詳解

    下面小編就為大家?guī)硪黄獪\談C語言函數(shù)調(diào)用參數(shù)壓棧的相關(guān)問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-10-10
  • C語言實(shí)現(xiàn)三子棋小游戲(vs2013多文件)

    C語言實(shí)現(xiàn)三子棋小游戲(vs2013多文件)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)三子棋小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06

最新評論