在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ù)組型字符串,只需稍加修改即可。
- //UTF8轉(zhuǎn)ANSI
- void UTF8toANSI(CString &strUTF8)
- {
- //獲取轉(zhuǎn)換為多字節(jié)后需要的緩沖區(qū)大小,創(chuàng)建多字節(jié)緩沖區(qū)
- UINT nLen = MultiByteToWideChar(CP_UTF8,NULL,strUTF8,-1,NULL,NULL);
- WCHAR *wszBuffer = new WCHAR[nLen+1];
- nLen = MultiByteToWideChar(CP_UTF8,NULL,strUTF8,-1,wszBuffer,nLen);
- wszBuffer[nLen] = 0;
-
- nLen = WideCharToMultiByte(936,NULL,wszBuffer,-1,NULL,NULL,NULL,NULL);
- CHAR *szBuffer = new CHAR[nLen+1];
- nLen = WideCharToMultiByte(936,NULL,wszBuffer,-1,szBuffer,nLen,NULL,NULL);
- szBuffer[nLen] = 0;
-
- strUTF8 = szBuffer;
- //清理內(nèi)存
- delete []szBuffer;
- delete []wszBuffer;
- }
- //ANSI轉(zhuǎn)UTF8
- void ANSItoUTF8(CString &strAnsi)
- {
- //獲取轉(zhuǎn)換為寬字節(jié)后需要的緩沖區(qū)大小,創(chuàng)建寬字節(jié)緩沖區(qū),936為簡體中文GB2312代碼頁
- UINT nLen = MultiByteToWideChar(936,NULL,strAnsi,-1,NULL,NULL);
- WCHAR *wszBuffer = new WCHAR[nLen+1];
- nLen = MultiByteToWideChar(936,NULL,strAnsi,-1,wszBuffer,nLen);
- wszBuffer[nLen] = 0;
- //獲取轉(zhuǎn)為UTF8多字節(jié)后需要的緩沖區(qū)大小,創(chuàng)建多字節(jié)緩沖區(qū)
- nLen = WideCharToMultiByte(CP_UTF8,NULL,wszBuffer,-1,NULL,NULL,NULL,NULL);
- CHAR *szBuffer = new CHAR[nLen+1];
- nLen = WideCharToMultiByte(CP_UTF8,NULL,wszBuffer,-1,szBuffer,nLen,NULL,NULL);
- szBuffer[nLen] = 0;
-
- strAnsi = szBuffer;
- //內(nèi)存清理
- delete []wszBuffer;
- delete []szBuffer;
- }
值得注意的是,UTF8編碼的字符串一般要將其保存在CHAR(char)型數(shù)組里,而不保存在WCHAR(wchar_t)型數(shù)組里。為什么呢?因為UTF8編碼的字符串每個字符占1-4個字節(jié),有的字符只占1個字節(jié),應(yīng)該用CHAR型數(shù)組來保存。而WCHAR的話,一個WCHAR就占兩個字節(jié),對于只需要一個字節(jié)的字符,就會出問題。
|