各種字符編碼間的轉(zhuǎn)換方法:MultiByteToWideChar和MultiByteToWideChar_第1頁(yè)
各種字符編碼間的轉(zhuǎn)換方法:MultiByteToWideChar和MultiByteToWideChar_第2頁(yè)
各種字符編碼間的轉(zhuǎn)換方法:MultiByteToWideChar和MultiByteToWideChar_第3頁(yè)
各種字符編碼間的轉(zhuǎn)換方法:MultiByteToWideChar和MultiByteToWideChar_第4頁(yè)
各種字符編碼間的轉(zhuǎn)換方法:MultiByteToWideChar和MultiByteToWideChar_第5頁(yè)
已閱讀5頁(yè),還剩15頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

MultiByteToWideChar和MultiByteToWideChar對(duì)各種字符編碼間的轉(zhuǎn)換函數(shù)原型:int WideCharToMultiByte(UINT CodePage,DWORD dwFlags,LPCWSTR lpWideCharStr,int cchWideChar,LPSTR lpMultiByteStr,int cbMultiByte,LPCSTR lpDefaultChar,LPBOOL lpUsedDefaultChar);此函數(shù)把寬字符串轉(zhuǎn)換成指定的新的字符串,如ANSI,UTF8等,新字符串不必是多字節(jié)字符集。參數(shù):CodePage: 指定要轉(zhuǎn)換成的字符集代碼頁(yè),它可以是任何已經(jīng)安裝的或系統(tǒng)自帶的字符集,你也可以使用如下所示代碼頁(yè)之一。參數(shù)說(shuō)明:1、CodePage指定要轉(zhuǎn)換成的字符集代碼頁(yè),它可以是任何已經(jīng)安裝的或系統(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 /Symbol代碼頁(yè),用于Windows 2000及以后版本 CP_THREAD_ACP /當(dāng)前線程ANSI代碼頁(yè),用于Windows 2000及以后版本 CP_UTF7 /UTF-7,設(shè)置此值時(shí)lpDefaultChar和lpUsedDefaultChar都必須為NULL CP_UTF8 /UTF-8,設(shè)置此值時(shí)lpDefaultChar和lpUsedDefaultChar都必須為NULL 用 GetLocaleInfo 函數(shù)獲取當(dāng)前系統(tǒng)的代碼頁(yè),936: 簡(jiǎn)體中文, 950: 繁體中文,949:韓文2、dwFlags 一般用 0 就可以了 指定是否轉(zhuǎn)換成預(yù)制字符或合成的寬字符,對(duì)控制字符是否使用像形文字,以及怎樣處理無(wú)效字符: MB_PRECOMPOSED /總是使用預(yù)制字符,即有單個(gè)預(yù)制字符時(shí),就不會(huì)使用分解的基字符和不占空間字符。此為函數(shù)的默認(rèn)選項(xiàng),不能和MB_COMPOSITE合用MB_COMPOSITE /總是使用分解字符,即總是使用基字符+不占空間字符的方式MB_ERR_INVALID_CHARS /設(shè)置此選項(xiàng),函數(shù)遇到非法字符就失敗并返回錯(cuò)誤碼ERROR_NO_UNICODE_TRANSLATION,否則丟棄非法字符MB_USEGLYPHCHARS /使用像形字符代替控制字符3、lpMultiByteStr /要轉(zhuǎn)換的字符串4、cbMultiByte /要轉(zhuǎn)換字符串的長(zhǎng)度,-1表示轉(zhuǎn)換到字符串結(jié)尾。返回原字符串長(zhǎng)度。0 作為結(jié)束符的字符串5、lpWideCharStr/接收轉(zhuǎn)換后輸出的寬字符串的緩沖,如果為 NULL, 就是代表計(jì)算生成的字符串的長(zhǎng)度。6、cchWideChar/輸出緩沖區(qū)大小,轉(zhuǎn)化生成的 unicode 字符串緩存的容量。如果為0,lpMultiByteStr將被忽略,函數(shù)將返回所需緩沖區(qū)大小而不同 為0表示調(diào)用失??;當(dāng)cchWideChar為0時(shí),函數(shù)將返回所需緩沖區(qū)大小int BufSize = MultiByteToWideChar(936,0,s,-1,NULL,0); /計(jì)算簡(jiǎn)體中文字符串 s 轉(zhuǎn)成 widestring 之后占用的內(nèi)存字節(jié)數(shù) /在此處為 wsbuf 分配內(nèi)存 BufSize 個(gè)字節(jié)MultiByteToWideChar(936,0,s,-1,wsbuf,BufSize); /把簡(jiǎn)體中文字符串 s 轉(zhuǎn)化為 unicode 的 WideString最常用的應(yīng)該是CP_ACP和CP_UTF8了,前者將寬字符轉(zhuǎn)換為ANSI,后者轉(zhuǎn)換為UTF8。例一:Unicode轉(zhuǎn)換到GBK#include #define CODE_PAGE_GB18030 54936int Unicode2GBK( wchar_t *pUnicode, char* ppDest) / get the size of the dest stringconst int size = :WideCharToMultiByte( CODE_PAGE_GB18030, 0/* you can do more for it*/,pUnicode, -1, 0, 0, 0, 0 );if ( size = 0 ) return -1; char* pDestString = new charsize + 2;:memset( pDestString, 0, sizeof(pDestString) );/ transformint ret = :WideCharToMultiByte( CODE_PAGE_GB18030, 0, pUnicode, -1, pDestString, size, 0, 0 );if( ret = 0 ) delete pDestString; return -1; else *ppDest = pDestString; return 0; 例二:字串轉(zhuǎn)換wchar_t* pwszUnicode = Holle, word! 你好,中國(guó)! ;int iSize;char* pszMultiByte;iSize = WideCharToMultiByte(CP_ACP, 0, pwszUnicode, -1, NULL, 0, NULL, NULL);pszMultiByte = (char*)malloc(iSize+1)/*sizeof(char)*/);WideCharToMultiByte(CP_ACP, 0, pwszUnicode, -1, pszMultiByte, iSize, NULL, NULL);注意事項(xiàng):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一起使用。 當(dāng)指定WC_COMPOSITECHECK時(shí),函數(shù)會(huì)將合成字符轉(zhuǎn)換成預(yù)制字符。合成字符由一個(gè)基字符和一個(gè)不占空間的字符(如歐洲國(guó)家及漢語(yǔ)拼音的音標(biāo))組成,每一個(gè)都有不同的字符值。預(yù)制字符有一個(gè)用于表示基字符和不占空間字符的合成體的單一的字符值。 當(dāng)指定WC_COMPOSITECHECK選項(xiàng)時(shí),也可以使用上表列出的最后3個(gè)選項(xiàng)來(lái)定制預(yù)制字符的轉(zhuǎn)換規(guī)則。這些選項(xiàng)決定了函數(shù)在遇到寬字符串的合成字符沒(méi)有對(duì)應(yīng)的預(yù)制字符時(shí)的行為,他們與WC_COMPOSITECHECK一起使用,如果都沒(méi)有指定,函數(shù)默認(rèn)WC_SEPCHARS。 對(duì)于下列代碼頁(yè),dwFlags必須為0,否則函數(shù)返回錯(cuò)誤碼ERROR_INVALID_FLAGS。50220 5022150222 50225 50227 50229 52936 54936 57002到5701165000(UTF7) 42(Symbol) 對(duì)于UTF8,dwFlags必須為0或WC_ERR_INVALID_CHARS,否則函數(shù)都將失敗返回并設(shè)置錯(cuò)誤碼ERROR_INVALID_FLAGS,你可以調(diào)用GetLastError獲得。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ì)更快一些。第二個(gè)是多字節(jié)字符到寬字符轉(zhuǎn)換函數(shù),函數(shù)原型如下: int MultiByteToWideChar(UINT CodePage,DWORD dwFlags,LPCSTR lpMultiByteStr,int cbMultiByte,LPWSTR lpWideCharStr,int cchWideChar);此函數(shù)把多字節(jié)字符串轉(zhuǎn)換成寬字符串(Unicode),待轉(zhuǎn)換的字符串并不一定是多字節(jié)的。此函數(shù)的參數(shù),返回值及注意事項(xiàng)參見(jiàn)上面函數(shù)WideCharToMultiByte的說(shuō)明,這里只對(duì)dwFlags做簡(jiǎn)單解釋。dwFlags: 指定是否轉(zhuǎn)換成預(yù)制字符或合成的寬字符,對(duì)控制字符是否使用像形文字,以及怎樣處理無(wú)效字符。 MB_PRECOMPOSED 總是使用預(yù)制字符,即有單個(gè)預(yù)制字符時(shí),就不會(huì)使用分解的基字符和不占空間字符。此為函數(shù)的默認(rèn)選項(xiàng),不能和MB_COMPOSITE合用 MB_COMPOSITE 總是使用分解字符,即總是使用基字符+不占空間字符的方式 MB_ERR_INVALID_CHARS 設(shè)置此選項(xiàng),函數(shù)遇到非法字符就失敗并返回錯(cuò)誤碼 ERROR_NO_UNICODE_TRANSLATION,否則丟棄非法字符 MB_USEGLYPHCHARS 使用像形字符代替控制字符 對(duì)于下列代碼頁(yè),dwFlags必須為0,否則函數(shù)返回錯(cuò)誤碼ERROR_INVALID_FLAGS。50220 5022150222 50225 50227 50229 52936 54936 57002到5701165000(UTF7) 42(Symbol)對(duì)于UTF8,dwFlags必須為0或MB_ERR_INVALID_CHARS,否則函數(shù)都將失敗并返回錯(cuò)誤碼ERROR_INVALID_FLAGS。 以下函數(shù)我沒(méi)用過(guò),只簡(jiǎn)要說(shuō)明之。int GetTextCharset( HDC hdc );此函數(shù)獲取當(dāng)前選進(jìn)的設(shè)備描述表的字符集,等同于GetTextCharsetInfo(hdc, NULL, 0)。返回值: 成功返回字符集標(biāo)識(shí),失敗返回DEFAULT_CHARSET。1.使用方法詳解在本文開(kāi)始之處,先簡(jiǎn)要地說(shuō)一下何為短字符和寬字符.所謂的短字符,就是用8bit來(lái)表示的字符,典型的應(yīng)用是ASCII碼.而寬字符,顧名思義,就是用16bit表示的字符,典型的有UNICODE.關(guān)于windows下的ASCII和UNICODE的更多信息,可以參考這兩本經(jīng)典著作:windows 程序設(shè)計(jì),windows 核心編程.這兩本書(shū)關(guān)于這兩種字符都有比較詳細(xì)的解說(shuō).寬字符轉(zhuǎn)換為多個(gè)短字符是一個(gè)難點(diǎn),不過(guò)我們只要掌握到其中的要領(lǐng),便可如魚(yú)得水.好吧,那就讓我們開(kāi)始吧.這個(gè)是我們需要轉(zhuǎn)化的多字節(jié)字符串:char sText20 = 多字節(jié)字符串!OK!;我們需要知道轉(zhuǎn)化后的寬字符需要多少個(gè)數(shù)組空間.雖然在這個(gè)里程里面,我們可以直接定義一個(gè)20*2寬字符的數(shù)組,并且事實(shí)上將運(yùn)行得非常輕松愉快.但假如多字節(jié)字符串更多,達(dá)到上千個(gè)乃至上萬(wàn)個(gè),我們將會(huì)發(fā)現(xiàn)其中浪費(fèi)的內(nèi)存將會(huì)越來(lái)越多.所以以多字節(jié)字符的個(gè)數(shù)的兩倍作為寬字符數(shù)組下標(biāo)的聲明絕對(duì)不是一個(gè)好主意.所幸,我們能夠確知所需要的數(shù)組空間。我們只需要將MultiByteToWideChar()的第四個(gè)形參設(shè)為-1,即可返回所需的短字符數(shù)組空間的個(gè)數(shù):DWORD dwNum = MultiByteToWideChar (CP_ACP, 0, sText, -1, NULL, 0); 接下來(lái),我們只需要分配響應(yīng)的數(shù)組空間:wchar_t *pwText;pwText = new wchar_tdwNum;if(!pwText) delete pwText; 接著,我們就可以著手進(jìn)行轉(zhuǎn)換了.在這里以轉(zhuǎn)換成ASCII碼做為例子:MultiByteToWideChar (CP_ACP, 0, psText, -1, sText, dwSize);最后,使用完畢當(dāng)然要記得釋放占用的內(nèi)存:delete psText;同理,寬字符轉(zhuǎn)為多字節(jié)字符的代碼如下:wchar_t wText20 = L寬字符轉(zhuǎn)換實(shí)例!OK!;DWORD dwNum = WideCharToMultiByte(CP_OEMCP,NULL,lpcwszStr,-1,NULL,0,NULL,FALSE);char *psText;psText = new chardwNum;if(!psText) delete psText; WideCharToMultiByte (CP_OEMCP,NULL,lpcwszStr,-1,psText,dwNum,NULL,FALSE);delete psText; 如果之前我們已經(jīng)分配好空間,并且由于字符串較短,可以不理會(huì)浪費(fèi)的空間,僅僅只是想簡(jiǎn)單地將短字符和寬字符相互轉(zhuǎn)換,那有沒(méi)有什么簡(jiǎn)便的方法呢? WIN32 API里沒(méi)有符合這種要求的函數(shù),但我們可以自己進(jìn)行封裝:BOOL MByteToWChar(LPCSTR lpcszStr, LPWSTR lpwszStr, DWORD dwSize)DWORD dwMinSize;dwMinSize = MultiByteToWideChar (CP_ACP, 0, lpcszStr, -1, NULL, 0);if(dwSize dwMinSize) return FALSE; MultiByteToWideChar (CP_ACP, 0, lpcszStr, -1, lpwszStr, dwMinSize);return TRUE;BOOL WCharToMByte(LPCWSTR lpcwszStr, LPSTR lpszStr, DWORD dwSize)DWORD dwMinSize;dwMinSize = WideCharToMultiByte(CP_OEMCP,NULL,lpcwszStr,-1,NULL,0,NULL,FALSE);if(dwSize Setting. - locale - default language ,選擇中文,然后編譯即可.Windows CE:不支持參數(shù)CodePage中的CP_UTF7和CP_UTF8的值,以及參數(shù)dwFlags中的WC_NO_BEST_FIT_CHARS值。速查:Windows NT 3.1、Windows 95以上、Windows CE 1.0以上,頭文件:winnls.h;庫(kù)文件:kernel32.lib。參考代碼:/GB2312 轉(zhuǎn)換成 Unicode:wchar_t* GB2312ToUnicode(const char* szGBString) UINT nCodePage = 936; /GB2312 int nLength=MultiByteToWideChar(nCodePage,0,szGBString,-1,NULL,0); wchar_t* pBuffer = new wchar_tnLength+1; MultiByteToWideChar(nCodePage,0,szGBString,-1,pBuffer,nLength); pBuffernLength=0; return pBuffer;/BIG5 轉(zhuǎn)換成 Unicode:wchar_t* BIG5ToUnicode(const char* szBIG5String) UINT nCodePage = 950; /BIG5 int nLength=MultiByteToWideChar(nCodePage,0,szBIG5String,-1,NULL,0); wchar_t* pBuffer = new wchar_tnLength+1; MultiByteToWideChar(nCodePage,0,szBIG5String,-1,pBuffer,nLength); pBuffernLength=0; return pBuffer;/Unicode 轉(zhuǎn)換成 GB2312:char* UnicodeToGB2312(const wchar_t* szUnicodeString) UINT nCodePage = 936; /GB2312 int nLength=WideCharToMultiByte(nCodePage,0,szUnicodeString,-1,NULL,0,NULL,NULL); char* pBuffer=new charnLength+1; WideCharToMultiByte(nCodePage,0,szUnicodeString,-1,pBuffer,nLength,NULL,NULL); pBuffernLength=0; return pBuffer;/Unicode 轉(zhuǎn)換成 BIG5:char* UnicodeToBIG5(const wchar_t* szUnicodeString) UINT nCodePage = 950; /BIG5 int nLength=WideCharToMultiByte(nCodePage,0,szUnicodeString,-1,NULL,0,NULL,NULL); char* pBuffer=new charnLength+1; WideCharToMultiByte(nCodePage,0,szUnicodeString,-1,pBuffer,nLength,NULL,NULL); pBuffernLength=0; return pBuffer;/繁體中文BIG5 轉(zhuǎn)換成 簡(jiǎn)體中文 GB2312char* BIG5ToGB2312(const char* szBIG5String)LCID lcid = MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),SORT_CHINESE_PRC); wchar_t* szUnicodeBuff = BIG5ToUnicode(szBIG5String); char* szGB2312Buff = UnicodeToGB2312(szUnicodeBuff); int nLength = LCMapString(lcid,LCMAP_SIMPLIFIED_CHINESE, szGB2312Buff,-1,NULL,0); char* pBuffer = new charnLength + 1; LCMapString(0x0804,LCMAP_SIMPLIFIED_CHINESE,szGB2312Buff,-1,pBuffer,nLength); pBuffernLength = 0; delete szUnicodeBuff; delete szGB2312Buff; return pBuffer;/簡(jiǎn)體中文 GB2312 轉(zhuǎn)換成 繁體中文BIG5char* GB2312ToBIG5(const char* szGBString)LCID lcid = MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),SORT_CHINESE_PRC); int nLength = LCMapString(lcid,LCMAP_TRADITIONAL_CHINESE,szGBString,-1,NULL,0); char* pBuffer=new charnLength+1; LCMapString(lcid,LCMAP_TRADITIONAL_CHINESE,szGBString,-1,pBuffer,nLength); pBuffernLength=0; wchar_t* pUnicodeBuff = GB2312ToUnicode(pBuffer); char* pBIG5Buff = UnicodeToBIG5(pUnicodeBuff); delete pBuffer; delete pUnicodeBuff; return pBIG5Buff;/string轉(zhuǎn)換為wstring:string str=_T(翔翔糖糖);int size=MultiByteToWideChar(CP_ACP,0,str.c_str(),-1,NULL,0);wchar_t *ch=new wchar_tsize+1;if(!MultiByteToWideChar(CP_ACP,0,str.c_str(),-1,ch,size) return false;wstring wstr=ch;/char*轉(zhuǎn)換為wchar_t*:char *str=_T(翔翔糖糖);int size=MultiByteToWideChar(CP_ACP,0,str,-1,NULL,0);wchar_t *ch=new wchar_tsize+1;if(!MultiByteToWideChar(CP_ACP,0,str,-1,ch,size) return false;MultiByteToWideChar使用例子char* OleDBCom:UnsignedShortToCharp(unsigned short *strU)UINT nStrULength=WideCharToMultiByte(CP_ACP,0,strU,-1,NULL,NULL,NULL,NULL);LPSTR lpStr;lpStr=(char*)malloc(nStrULength);WideCharToMultiByte(CP_ACP,0,strU,-1,lpStr,nStrULength,NULL,NULL);return lpStr;unsigned short* OleDBCom:CharpToUnsignedShort(LPSTR str)OLECHAR strU255;int nStatus=MultiByteToWideChar(CP_ACP,0,str,-1,strU,255);return strU;HRESULT _fastcall AnsiToUnicode(LPCSTR pszA, LPOLESTR* ppszW) ULONG cCharacters; DWORD dwError; if (NULL = pszA) *ppszW = NULL; return NOERROR; cCharacters = strlen(pszA)+1; *ppszW = (LPOLESTR) CoTaskMemAlloc(cCharacters*2); if (NULL = *ppszW) return E_OUTOFMEMORY; if (0 = MultiByteToWideChar(CP_ACP, 0, pszA, cCharacters, *ppszW, cCharacters) dwError = GetLastError(); CoTaskMemFree(*ppszW); *ppszW = NULL; return HRESULT_FROM_WIN32(dwError); return NOERROR;這里有個(gè)例子,PWSTR pWideCharStr;int nLenOfWideCharStr;首先計(jì)算需要的寬字符串的字符數(shù)nLenOfWideCharStr=MultiByteToWideChar(CP_ACP,0,pMultiByteStr,-1,NULL,0)這里的pMultiByteStr是要轉(zhuǎn)換的多字節(jié)字符。給pWideCharStr分配內(nèi)存塊pWideCharStr=HeapAlloc(GetProcessHeap(),0,nLenOfWideCharStr*sizeof(WCHAR);然后把多字節(jié)字符串轉(zhuǎn)換成寬字符串MultiByteToWideChar(CP_ACP,0,pMultiByteStr,-1,pWideCharStr,nLenOfWideCharStr)WideCharToMultiByte和MultiByteToWideChar函數(shù)的用法為了支持Unicode編碼,需要多字節(jié)與寬字節(jié)之間的相互轉(zhuǎn)換。這兩個(gè)系統(tǒng)函數(shù)在使用時(shí)需要指定代碼頁(yè),在實(shí)際應(yīng)用過(guò)程中遇到亂碼問(wèn)題,然后重新閱讀Windows核心編程,總結(jié)出正確的用法。WideCharToMultiByte的代碼頁(yè)用來(lái)標(biāo)記與新轉(zhuǎn)換的字符串相關(guān)的代碼頁(yè)。MultiByteToWideChar的代碼頁(yè)用來(lái)標(biāo)記與一個(gè)多字節(jié)字符串相關(guān)的代碼頁(yè)。常用的代碼頁(yè)由CP_ACP和CP_UTF8兩個(gè)。使用CP_ACP代碼頁(yè)就實(shí)現(xiàn)了ANSI與Unicode之間的轉(zhuǎn)換。使用CP_UTF8代碼頁(yè)就實(shí)現(xiàn)了UTF-8與Unicode之間的轉(zhuǎn)換。下面是代碼實(shí)現(xiàn):1. ANSI to Unicodewstring ANSIToUnicode( const string& str )int len = 0;len = str.length();int unicodeLen = :MultiByteToWideChar( CP_ACP, 0, str.c_str(), -1, NULL, 0 );wchar_t * pUnicode;pUnicode = new ;memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t);:MultiByteToWideChar( CP_ACP, 0, str.c_str(), -1, (LPWSTR)pUnicode, unicodeLen );wstring rt;rt = ( wchar_t* )pUnicode;delete pUnicode;return rt;2. Unicode to ANSIstring UnicodeToANSI( const wstring& str )char* pElementText;int iTextLen;iTextLen = WideCharToMultiByte( CP_ACP, 0, str.c_str(), -1, NULL, 0, NULL, NULL );pElementText = new chariTextLen + 1;memset( ( void* )pElementText, 0, sizeof( char ) * ( iTextLen + 1) );:WideCharToMultiByte( CP_ACP, 0, str.c_str(), -1, pElementText, iTextLen, NULL, NULL );string strText;strText = pElementText;delete pElementText;return strText;3. UTF-8 to Unicodewstring UTF8ToUnicode( const string& str )int len = 0;len = str.length();int unicodeLen = :MultiByteToWideChar( CP_UTF8, 0, str.c_str(), -1, NULL, 0 );wchar_t * pUnicode;pUnicode = new wchar_tunicodeLen+1;memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t);:MultiByteToWideChar( CP_UTF8, 0, str.c_str(), -1, (LPWSTR)pUnicode, unicodeLen );wstring rt;rt = ( wchar_t* )pUnicode;delete pUnicode;return rt;4. Unicode to UTF-8string UnicodeToUTF8( const wstring& str )char* pElementText;int iTextLen;iTextLen = WideCharToMultiByte( CP_UTF8, 0, str.c_str(), -1, NULL, 0, NULL, NULL );pElementText = new chariTextLen + 1;memset( ( void* )pElementText, 0, sizeof( char ) * ( iTextLen + 1) );:WideCharToMultiByte( CP_UTF8, 0, str.c_str(), -1, pElementText, iTextLen, NULL, NULL );string strText;strText = pElementText;delete pElementText;return strText;#include stdafx.h#include string.h#include stdio.h#include windows.hint main(int argc, char* argv)char temp20;int nLen;LPWSTR name = LCPU;sprintf(temp,CPU%02d,i);nLen = MultiByteToWideChar(CP_ACP,0,temp,-1,NULL,0);MultiByteToWideChar(CP_ACP,0,temp,-1,(LPWSTR)name,nLen);WideCharToMultiByte(CP_ACP,0,(LPWSTR)name,-1, strs,100,NULL,NULL);printf(good: %s /n,name);return 0;調(diào)試時(shí),在MultiByteToWideChar處報(bào)錯(cuò)MultiByteToWideChar 函數(shù)把一個(gè)字符串映射為一個(gè)寬字符串。被這個(gè)函數(shù)映射的字符串不必屬于多字節(jié)字符集。 返回值:若該函數(shù)成功,且 cchMultiByte 為非零值,則返回值是寫(xiě)入由 lpWideCharStr 指向的緩沖區(qū)中的寬字符數(shù)。若該函數(shù)成功,且 cchMultiByte 為零,則返回值是以寬字符為單位的緩沖區(qū)大小值。該緩沖區(qū)可以接收轉(zhuǎn)換后的字符串。若該函數(shù)失敗,則返回值為FALSE,調(diào)用GetLastErro可獲得補(bǔ)充的錯(cuò)誤信息。1 /- /函數(shù)輸入Big5字符,返回Gb簡(jiǎn)體字符 /兩次轉(zhuǎn)換

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論