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

分享

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

 herowuking 2015-06-26

在windows下打開一個記事本,保存文件,下面有四種編碼選擇。ANSI,也就是多字節(jié)字符集,在VC中也就是CHAR(char)字符串。Unicode,就是UTF16,在VC中也就是WCHAR(wchar_t)字符串。Unicode big endian ,就是UTF32,這種編碼用的比較少。UTF8,網(wǎng)頁上幾乎都是用UTF8,UTF8用1-4個字節(jié)來編碼所有的字符,英文只需要1個 字節(jié),中文需要3-4個字節(jié)。比起UTF16來說,UTF8這樣可以盡可能的節(jié)省網(wǎng)絡(luò)帶寬,因為在網(wǎng)絡(luò)上傳輸?shù)淖址蟛糠忠杂⑽臑橹?。UTF16至少是2個字節(jié),部分字符4個字節(jié)。

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

下面貼出我寫的兩個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為簡體中文GB2312代碼頁  
  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ù)組里。為什么呢?因為UTF8編碼的字符串每個字符占1-4個字節(jié),有的字符只占1個字節(jié),應(yīng)該用CHAR型數(shù)組來保存。而WCHAR的話,一個WCHAR就占兩個字節(jié),對于只需要一個字節(jié)的字符,就會出問題。

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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多