小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

VC++下處理UTF8編碼的字符串

 herowuking 2015-06-26

在windows下打開(kāi)一個(gè)記事本,保存文件,下面有四種編碼選擇。ANSI,也就是多字節(jié)字符集,在VC中也就是CHAR(char)字符串。Unicode,就是UTF16,在VC中也就是WCHAR(wchar_t)字符串。Unicode big endian ,就是UTF32,這種編碼用的比較少。UTF8,網(wǎng)頁(yè)上幾乎都是用UTF8,UTF8用1-4個(gè)字節(jié)來(lái)編碼所有的字符,英文只需要1個(gè) 字節(jié),中文需要3-4個(gè)字節(jié)。比起UTF16來(lái)說(shuō),UTF8這樣可以盡可能的節(jié)省網(wǎng)絡(luò)帶寬,因?yàn)樵诰W(wǎng)絡(luò)上傳輸?shù)淖址?,大部分以英文為主。UTF16至少是2個(gè)字節(jié),部分字符4個(gè)字節(jié)。

如果我們寫(xiě)一個(gè)VC程序,從獲取HTML網(wǎng)頁(yè)數(shù)據(jù),這些數(shù)據(jù)的編碼是UTF8的,獲取到我們VC程序中的CHAR字符數(shù)組中時(shí)就會(huì)發(fā)現(xiàn),英文可以正常顯示,中文全部亂碼了。因?yàn)槲覀兊腃HAR型字符串用的是ANSI編碼。要想把UTF8轉(zhuǎn)換為ANSI,一般有兩種方法。一種是手工寫(xiě)代碼實(shí)現(xiàn),百度上搜索可以發(fā)現(xiàn)很多資料,透徹了解這些字符集編碼后,可以手工來(lái)實(shí)現(xiàn)轉(zhuǎn)換,網(wǎng)上也有很多別人寫(xiě)好的轉(zhuǎn)換函數(shù)。一種方法就是借助第三方函數(shù)庫(kù)。由于我們?cè)趙indows平臺(tái)下編寫(xiě)程序,我們可以使用API函數(shù)來(lái)轉(zhuǎn)換MultiByteToWideChar和WideCharToMultiByte。使用這個(gè)函數(shù),我們得進(jìn)行兩次轉(zhuǎn)換,先用MultiByteToWideChar把UTF8編碼的CHAR字符串轉(zhuǎn)換成WCHAR字符串,第一個(gè)參數(shù)要注明我們要轉(zhuǎn)換的代碼頁(yè)為CP_UTF8,即UTF8的意思。然后用WideCharToMultiByte吧WCHAR字符串轉(zhuǎn)換成CHAR字符串,第一個(gè)參數(shù)使用936,936代碼頁(yè)的意思是簡(jiǎn)體中文。有關(guān)代碼頁(yè)的知識(shí)可以百度百科一下。

下面貼出我寫(xiě)的兩個(gè)ANSI與UTF8互轉(zhuǎn)的函數(shù)。參數(shù)為MFC中的CString字符串,如果要傳入C樣式的字符數(shù)組型字符串,只需稍加修改即可。

  1. //UTF8轉(zhuǎn)ANSI  
  2. void UTF8toANSI(CString &strUTF8)  
  3. {  
  4.     //獲取轉(zhuǎn)換為多字節(jié)后需要的緩沖區(qū)大小,創(chuàng)建多字節(jié)緩沖區(qū)  
  5.     UINT nLen = MultiByteToWideChar(CP_UTF8,NULL,strUTF8,-1,NULL,NULL);  
  6.     WCHAR *wszBuffer = new WCHAR[nLen+1];  
  7.     nLen = MultiByteToWideChar(CP_UTF8,NULL,strUTF8,-1,wszBuffer,nLen);  
  8.     wszBuffer[nLen] = 0;  
  9.   
  10.     nLen = WideCharToMultiByte(936,NULL,wszBuffer,-1,NULL,NULL,NULL,NULL);  
  11.     CHAR *szBuffer = new CHAR[nLen+1];  
  12.     nLen = WideCharToMultiByte(936,NULL,wszBuffer,-1,szBuffer,nLen,NULL,NULL);  
  13.     szBuffer[nLen] = 0;  
  14.       
  15.     strUTF8 = szBuffer;  
  16.     //清理內(nèi)存  
  17.     delete []szBuffer;  
  18.     delete []wszBuffer;  
  19. }  
  1. //ANSI轉(zhuǎn)UTF8  
  2. void ANSItoUTF8(CString &strAnsi)  
  3. {  
  4.     //獲取轉(zhuǎn)換為寬字節(jié)后需要的緩沖區(qū)大小,創(chuàng)建寬字節(jié)緩沖區(qū),936為簡(jiǎn)體中文GB2312代碼頁(yè)  
  5.     UINT nLen = MultiByteToWideChar(936,NULL,strAnsi,-1,NULL,NULL);  
  6.     WCHAR *wszBuffer = new WCHAR[nLen+1];  
  7.     nLen = MultiByteToWideChar(936,NULL,strAnsi,-1,wszBuffer,nLen);  
  8.     wszBuffer[nLen] = 0;  
  9.     //獲取轉(zhuǎn)為UTF8多字節(jié)后需要的緩沖區(qū)大小,創(chuàng)建多字節(jié)緩沖區(qū)  
  10.     nLen = WideCharToMultiByte(CP_UTF8,NULL,wszBuffer,-1,NULL,NULL,NULL,NULL);  
  11.     CHAR *szBuffer = new CHAR[nLen+1];  
  12.     nLen = WideCharToMultiByte(CP_UTF8,NULL,wszBuffer,-1,szBuffer,nLen,NULL,NULL);  
  13.     szBuffer[nLen] = 0;  
  14.       
  15.     strAnsi = szBuffer;  
  16.     //內(nèi)存清理  
  17.     delete []wszBuffer;  
  18.     delete []szBuffer;  
  19. }  


 

值得注意的是,UTF8編碼的字符串一般要將其保存在CHAR(char)型數(shù)組里,而不保存在WCHAR(wchar_t)型數(shù)組里。為什么呢?因?yàn)閁TF8編碼的字符串每個(gè)字符占1-4個(gè)字節(jié),有的字符只占1個(gè)字節(jié),應(yīng)該用CHAR型數(shù)組來(lái)保存。而WCHAR的話(huà),一個(gè)WCHAR就占兩個(gè)字節(jié),對(duì)于只需要一個(gè)字節(jié)的字符,就會(huì)出問(wèn)題。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多