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

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

 更新時(shí)間:2021年08月19日 08:50:23   作者:eagle659  
這篇文章主要介紹了C++ WideCharToMultiByte()函數(shù)案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(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)換的代碼頁(yè),這個(gè)參數(shù)可以為系統(tǒng)已安裝或有效的任何代碼頁(yè)所給定的值。
CP_ACP 當(dāng)前系統(tǒng)ANSI代碼頁(yè)
CP_MACCP 當(dāng)前系統(tǒng)Macintosh代碼頁(yè)
CP_OEMCP 當(dāng)前系統(tǒng)OEM代碼頁(yè),一種原始設(shè)備制造商硬件掃描碼
CP_SYMBOL 符號(hào)代碼頁(yè)(42)
CP_THREAD_ACP 當(dāng)前線程ANSI代碼頁(yè)
  • dwFlags:指定如何處理沒(méi)有轉(zhuǎn)換的字符,但不設(shè)此參數(shù)函數(shù)會(huì)運(yùn)行的更快一些,我都是把它設(shè)為0。

可設(shè)的值如下表所示:

WC_NO_BEST_FIT_CHARS 
把不能直接轉(zhuǎn)換成相應(yīng)多字節(jié)字符的Unicode字符轉(zhuǎn)換成lpDefaultChar指定的默認(rèn)字符。也就是說(shuō),如果把Unicode轉(zhuǎn)換成多字節(jié)字符,然后再轉(zhuǎn)換回來(lái),你并不一定得到相同的Unicode字符,因?yàn)檫@期間可能使用了默認(rèn)字符。此選項(xiàng)可以單獨(dú)使用,也可以和其他選項(xiàng)一起使用。

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

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

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

WC_SEPCHARS
 轉(zhuǎn)換時(shí)產(chǎn)生單獨(dú)的字符,此是默認(rèn)轉(zhuǎn)換選項(xiàng),WC_COMPOSITECHECK一起使用

WC_DEFAULTCHAR
 轉(zhuǎn)換時(shí)使用默認(rèn)字符代替例外的字符,(最常見(jiàn)的如'?'),與WC_COMPOSITECHECK一起使用。
  1. lpWideCharStr: 待轉(zhuǎn)換的寬字符串。
  2. cchWideChar: 待轉(zhuǎn)換寬字符串的長(zhǎng)度,-1表示轉(zhuǎn)換到字符串結(jié)尾。
  3. lpMultiByteStr: 接收轉(zhuǎn)換后輸出新串的緩沖區(qū)。
  4. cbMultiByte: 輸出緩沖區(qū)大小,如果為0,lpMultiByteStr將被忽略,函數(shù)將返回所需緩沖區(qū)大小而不使用lpMultiByteStr。
  5. lpDefaultChar: 指向字符的指針, 在指定編碼里找不到相應(yīng)字符時(shí)使用此字符作為默認(rèn)字符代替。如果為NULL則使用系統(tǒng)默認(rèn)字符。對(duì)于要求此參數(shù)為NULL的dwFlags而使用此參數(shù),函數(shù)將失敗返回并設(shè)置錯(cuò)誤碼ERROR_INVALID_PARAMETER。
  6. lpUsedDefaultChar: 開(kāi)關(guān)變量的指針,用以表明是否使用過(guò)默認(rèn)字符。對(duì)于要求此參數(shù)為NULL的dwFlags而使用此參數(shù),函數(shù)將失敗返回并設(shè)置錯(cuò)誤碼ERROR_INVALID_PARAMETER。lpDefaultChar和lpUsedDefaultChar都設(shè)為NULL,函數(shù)會(huì)更快一些。
  7. 返回值: 如果函數(shù)成功,且cbMultiByte非0,返回寫(xiě)入lpMultiByteStr的字節(jié)數(shù)(包括字符串結(jié)尾的null);cbMultiByte為0,則返回轉(zhuǎn)換所需字節(jié)數(shù)。函數(shù)失敗,返回0。

注意: 函數(shù)WideCharToMultiByte使用不當(dāng),會(huì)給影響程序的安全。調(diào)用此函數(shù)會(huì)很容易導(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ū),詳見(jiàn)下面的代碼。另外,從Unicode UTF16向非Unicode字符集轉(zhuǎn)換可能會(huì)導(dǎo)致數(shù)據(jù)丟失,因?yàn)樵撟址赡軣o(wú)法找到表示特定Unicode數(shù)據(jù)的字符。

demo1

wchar_t* pwszUnicode = L"Holle, word! 你好,中國(guó)! ";
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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

哈巴河县| 汉沽区| 宜良县| 贞丰县| 余庆县| 汶上县| 德保县| 永昌县| 砀山县| 新竹市| 柘荣县| 甘孜县| 博湖县| 张家港市| 荥经县| 娄烦县| 绍兴县| 古浪县| 磐安县| 昌乐县| 苍梧县| 铜川市| 冕宁县| 唐河县| 芦溪县| 化州市| 原阳县| 青田县| 沙雅县| 当阳市| 固阳县| 华宁县| 永泰县| 绥德县| 喀喇| 新蔡县| 奈曼旗| 遂平县| 呈贡县| 饶阳县| 浏阳市|