乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      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的話,一個(gè)WCHAR就占兩個(gè)字節(jié),對(duì)于只需要一個(gè)字節(jié)的字符,就會(huì)出問(wèn)題。

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(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)遵守用戶 評(píng)論公約

        類似文章 更多