最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2021年08月19日 08:50:23   作者:eagle659  
這篇文章主要介紹了C++ WideCharToMultiByte()函數(shù)案例詳解,本篇文章通過簡要的案例,講解了該項技術(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字符,因為這期間可能使用了默認(rèn)字符。此選項可以單獨(dú)使用,也可以和其他選項一起使用。

WC_COMPOSITECHECK 
把合成字符轉(zhuǎn)換成預(yù)制的字符。它可以與后三個選項中的任何一個組合使用,如果沒有與他們中的任何一個組合,則與選項WC_SEPCHARS相同。

WC_ERR_INVALID_CHARS 
此選項會致使函數(shù)遇到無效字符時失敗返回,并且GetLastError會返回錯誤碼ERROR_NO_UNICODE_TRANSLATION。否則函數(shù)會自動丟棄非法字符。此選項只能用于UTF8。

WC_DISCARDNS    
  轉(zhuǎn)換時丟棄不占空間的字符,與WC_COMPOSITECHECK 一起使用

WC_SEPCHARS
 轉(zhuǎn)換時產(chǎn)生單獨(dú)的字符,此是默認(rèn)轉(zhuǎn)換選項,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)存泄漏,因為lpWideCharStr指向的輸入緩沖區(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ù)丟失,因為該字符集可能無法找到表示特定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)文章

最新評論

余庆县| 宜城市| 永吉县| 苏尼特左旗| 梁山县| 昆明市| 靖宇县| 明星| 东兰县| 志丹县| 改则县| 图们市| 汉源县| 永泰县| 平顶山市| 余干县| 凭祥市| 涿州市| 北京市| 江孜县| 盱眙县| 嵩明县| 屯门区| 濮阳县| 和顺县| 深水埗区| 定结县| 深泽县| 桃园县| 钦州市| 广水市| 武安市| 平塘县| 双柏县| 巴楚县| 获嘉县| 彩票| 五原县| 商河县| 社旗县| 专栏|