字符編碼之間的相互轉(zhuǎn)換_第1頁
字符編碼之間的相互轉(zhuǎn)換_第2頁
字符編碼之間的相互轉(zhuǎn)換_第3頁
字符編碼之間的相互轉(zhuǎn)換_第4頁
字符編碼之間的相互轉(zhuǎn)換_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、字符編碼之間的相互轉(zhuǎn)換UTF8與GBKC+UTF8編碼轉(zhuǎn)換CChineseCode一預備知識1,字符:字符是抽象的最小文本單位。它沒有固定的形狀(可能是一個字形),而且沒有值?!癆”是一個字符,“”(德國、法國和許多其他歐洲國家通用貨幣的標志)也是一個字符?!爸小薄皣边@是兩個漢字字符。字符僅僅代表一個符號,沒有任何實際值的意義。2,字符集:字符集是字符的集合。例如,漢字字符是中國人最先發(fā)明的字符,在中文、日文、韓文和越南文的書寫中使用。這也說明了字符和字符集之間的關(guān)系,字符組成字符集(iso8859-1,GB2312/GBK,unicode)。3,代碼點:字符集中的每個字符都被分配到一個“代

2、碼點”。每個代碼點都有一個特定的唯一數(shù)值,稱為標值。該標量值通常用十六進制表示。4,代碼單元:在每種編碼形式中,代碼點被映射到一個或多個代碼單元。“代碼單元”是各個編碼方式中的單個單元。代碼單元的大小等效于特定編碼方式的位數(shù):UTF-8:UTF-8中的代碼單元由8位組成;在UTF-8中,因為代碼單元較小的緣故,每個代碼點常常被映射到多個代碼單元。代碼點將被映射到一個、兩個、三個或四個代碼單元;UTF-16:UTF-16中的代碼單元由16位組成;UTF-16的代碼單元大小是8位代碼單元的兩倍。所以,標量值小于U+10000的代碼點被編碼到單個代碼單元中;UTF-32:UTF-32中的代碼單元由3

3、2位組成;UTF-32中使用的32位代碼單元足夠大,每個代碼點都可編碼為單個代碼單元;GB18030:GB18030中的代碼單元由8位組成;在GB18030中,因為代碼單元較小的緣故,每個代碼點常常被映射到多個代碼單元。代碼點將被映射到一個、兩個或四個代碼單元。5,舉例:“中國北京香蕉是個大笨蛋”這是我定義的aka字符集;各字符對應(yīng)代碼點為:北京香蕉是個大笨蛋中國下面是我定義的zixia編碼方案(8位),可以看到它的編碼中表示了aka字符集的所有字符對應(yīng)的代碼單元;北京香蕉是個大笨蛋中國所謂文本文件就是我們按一定編碼方式將二進制數(shù)據(jù)表示為對應(yīng)的文本如0這樣的文件。我用一個支持zixia編碼和a

4、ka字符集的記事本打開,它就按照編碼方案顯示為“香蕉是個大笨蛋”如果我把這些字符按照GBK另存一個文件,那么則肯定不是這個,而是000111011000111101101001111111100000二,字符集1,常用字符集分類ASCII及其擴展字符集作用:表語英語及西歐語言。位數(shù):ASCII是用7位表示的,能表示128個字符;其擴展使用8位表示,表示256個字符。范圍:ASCII從00到7F,擴展從00到FF。ISO-8859-1字符集作用:擴展ASCII,表示西歐、希臘語等。位數(shù):8位,范圍:從00到FF,兼容ASCII字符集。GB2312字符集作用:國家簡體中文字符集,兼容ASCII。位

5、數(shù):使用2個字節(jié)表示,能表示7445個符號,包括6763個漢字,幾乎覆蓋所有高頻率漢字。范圍:高字節(jié)從A1到F7,低字節(jié)從A1到FE。將高字節(jié)和低字節(jié)分別加上0XA0即可得到編碼。BIG5字符集作用:統(tǒng)一繁體字編碼。位數(shù):使用2個字節(jié)表示,表示13053個漢字。范圍:高字節(jié)從A1到F9,低字節(jié)從40到7E,A1到FE。GBK字符集作用:它是GB2312的擴展,加入對繁體字的支持,兼容GB2312。位數(shù):使用2個字節(jié)表示,可表示21886個字符。范圍:高字節(jié)從81到FE,低字節(jié)從40到FE。GB18030字符集作用:它解決了中文、日文、朝鮮語等的編碼,兼容GBK。位數(shù):它采用變字節(jié)表示(1ASC

6、II,2,4字節(jié))??杀硎?7484個文字。范圍:1字節(jié)從00到7F;2字節(jié)高字節(jié)從81到FE,低字節(jié)從40到7E和80到FE;4字節(jié)第一三字節(jié)從81到FE,第二四字節(jié)從30到39。UCS字符集作用:國際標準ISO10646定義了通用字符集(UniversalCharacterSet)。它是與UNICODE同類的組織,UCS-2和UNICODE兼容。位數(shù):它有UCS-2和UCS-4兩種格式,分別是2字節(jié)和4字節(jié)。范圍:目前,UCS-4只是在UCS-2前面加了00000。UNICODE字符集作用:為世界650種語言進行統(tǒng)一編碼,兼容ISO-8859-1。位數(shù):UNICODE字符集有多個編碼方式,

7、分別是UTF-8,UTF-16和UTF-32。2,按所表示的文字分類語言字符集正式名稱英語、西歐語ASCII,ISO-8859-1MBCS多字節(jié)簡體中文GB2312MBCS多字節(jié)繁體中文BIG5MBCS多字節(jié)簡繁中文GBKMBCS多字節(jié)中文、日文及朝鮮語GB18030MBCS多字節(jié)各國語言UNICODE,UCSDBCS寬字節(jié)三,編碼UTF-8:采用變長字節(jié)(1ASCII,2希臘字母,3漢字,4平面符號)表示,網(wǎng)絡(luò)傳輸,即使錯了一個字節(jié),不影響其他字節(jié),而雙字節(jié)只要一個錯了,其他也錯了,具體如下:如果只有一個字節(jié)則其最高二進制位為0;如果是多字節(jié),其第一個字節(jié)從最高位開始,連續(xù)的二進制位值為1的

8、個數(shù)決定了其編碼的字節(jié)數(shù),其余各字節(jié)均以10開頭。UTF-8最多可用到6個字節(jié)。UTF-16:采用2字節(jié),Unicode中不同部分的字符都同樣基于現(xiàn)有的標準。這是為了便于轉(zhuǎn)換。從00000到0007F是ASCII字符,從00080到000FF是ISO-8859-1對ASCII的擴展。希臘字母表使用從00370到003FF的代碼,斯拉夫語使用從00400到004FF的代碼,美國使用從00530到0058F的代碼,希伯來語使用從00590到005FF的代碼。中國、日本和韓國的象形文字(總稱為CJK)占用了從03000到09FFF的代碼;由于000在c語言及操作系統(tǒng)文件名等中有特殊意義,故很多情況下

9、需要UTF-8編碼保存文本,去掉這個000。舉例如下:UTF-16:00080=0000000010000000UTF-8:0xC280=1100001010000000UTF-32:采用4字節(jié)。優(yōu)缺點UTF-8、UTF-16和UTF-32都可以表示有效編碼空間(U+-U+10FFFF)內(nèi)的所有Unicode字符。使用UTF-8編碼時ASCII字符只占1個字節(jié),存儲效率比較高,適用于拉丁字符較多的場合以節(jié)省空間。對于大多數(shù)非拉丁字符(如中文和日文)來說,UTF-16所需存儲空間最小,每個字符只占2個字節(jié)。WindowsNT內(nèi)核是Unicode(UTF-16),采用UTF-16編碼在調(diào)用系統(tǒng)AP

10、I時無需轉(zhuǎn)換,處理速度也比較快。采用UTF-16和UTF-32會有BigEndian和LittleEndian之分,而UTF-8則沒有字節(jié)順序問題,所以UTF-8適合傳輸和通信。UTF-32采用4字節(jié)編碼,一方面處理速度比較快,但另一方面也浪費了大量空間,影響傳輸速度,因而很少使用。四,如何判斷字符集1,字節(jié)序首先說一下字節(jié)序?qū)幋a的影響,字節(jié)序分為BigEndian字節(jié)序和LittleEndian字節(jié)序。不同的處理器可能不一樣。所以,傳輸時需要告訴處理器當時的編碼字節(jié)序。對于前者而言,高位字節(jié)存在低地址,低字節(jié)存于高地址;后者相反。例如,0X03AB,BigEndian字節(jié)序0000:030

11、001:ABLittleEndian字節(jié)序是0000:AB0001:032,編碼識別UNICODE,根據(jù)前幾個字節(jié)可以判斷UNICODE字符集的各種編碼,叫做ByteOrderMask方法BOM:UTF-8:EFBBBF(符合UTF-8格式,請看上面。但沒有含義在UCS即UNICODE中)UTF-16BigEndian:FEFF(沒有含義在UCS-2中)UTF-16LittleEndian:FFFE(沒有含義在UCS-2中)UTF-32BigEndian:0000FEFF(沒有含義在UCS-4中)UTF-32LittleEndian:FFFE0000(沒有含義在UCS-4中)GB2312:高字

12、節(jié)和低字節(jié)的第1位都是1。BIG5,GBK&GB18030:高字節(jié)的第1位為1。操作系統(tǒng)有默認的編碼,常為GBK,可以下載別的并升級。通過判斷高字節(jié)的第1位從而知道是ASCII或者漢字編碼。#include#include/GBK編碼轉(zhuǎn)換到UTF8編碼intGBKToUTF8(unsignedchar*lpGBKStr,unsignedchar*lpUTF8Str,intnUTF8StrLen)wchar_t*lpUnicodeStr=NULL;intnRetLen=0;if(!lpGBKStr)/如果GBK字符串為NULL則出錯退出return0;nRetLen=:MultiByteToWi

13、deChar(CP_ACP,0,(char*)lpGBKStr,-1,NULL,NULL);/獲取轉(zhuǎn)換到Unicode編碼后所需要的字符空間長度lpUnicodeStr=newWCHARnRetLen+1;/為Unicode字符串空間nRetLen=:MultiByteToWideChar(CP_ACP,0,(char*)lpGBKStr,-1,lpUnicodeStr,nRetLen);/轉(zhuǎn)換到Unicode編碼if(!nRetLen)/轉(zhuǎn)換失敗則出錯退出return0;nRetLen=:WideCharToMultiByte(CP_UTF8,0,lpUnicodeStr,-1,NULL,0

14、,NULL,NULL);/獲取轉(zhuǎn)換到UTF8編碼后所需要的字符空間長度if(!lpUTF8Str)/輸出緩沖區(qū)為空則返回轉(zhuǎn)換后需要的空間大小if(lpUnicodeStr)deletelpUnicodeStr;returnnRetLen;if(nUTF8StrLennRetLen)/如果輸出緩沖區(qū)長度不夠則退出if(lpUnicodeStr)deletelpUnicodeStr;return0;nRetLen=:WideCharToMultiByte(CP_UTF8,0,lpUnicodeStr,-1,(char*)lpUTF8Str,nUTF8StrLen,NULL,NULL);/轉(zhuǎn)換到UT

15、F8編碼if(lpUnicodeStr)deletelpUnicodeStr;returnnRetLen;/使用這兩個函數(shù)的例子intmain()charcGBKStr=我是中國人!;char*lpGBKStr=NULL;char*lpUTF8Str=NULL;FILE*fp=NULL;intnRetLen=0;nRetLen=GBKToUTF8(unsignedchar*)cGBKStr,NULL,NULL);printf(轉(zhuǎn)換后的字符串需要的空間長度為:%d,nRetLen);lpUTF8Str=newcharnRetLen+1;nRetLen=GBKToUTF8(unsignedchar

16、*)cGBKStr,(unsignedchar*)lpUTF8Str,nRetLen);if(nRetLen)printf(GBKToUTF8轉(zhuǎn)換成功!);elseprintf(GBKToUTF8轉(zhuǎn)換失敗!);gotoRet0;fp=fopen(C:GBKtoUTF8.txt,wb);/保存到文本文件fwrite(lpUTF8Str,nRetLen,1,fp);fclose(fp);getchar();/先去打開那個文本文件看看,單擊記事本的“文件”-“另存為”菜單,在對話框中看到編碼框變?yōu)榱恕癠TF-8”說明轉(zhuǎn)換成功了Ret0:if(lpGBKStr)deletelpGBKStr;if(lp

17、UTF8Str)deletelpUTF8Str;return0;1classCChineseCode2345public:67staticvoidUTF_8ToUnicode(wchar_t*pOut,char*pText);/把UTF-8轉(zhuǎn)換成Unicode89staticvoidUnicodeToUTF_8(char*pOut,wchar_t*pText);/Unicode轉(zhuǎn)換成UTF-81011staticvoidUnicodeToGB2312(char*pOut,wchar_tuData);/把Unicode轉(zhuǎn)換成GB23121213staticvoidGb2312ToUnicode(

18、wchar_t*pOut,char*gbBuffer);/GB2312轉(zhuǎn)換成Unicode1415staticvoidGB2312ToUTF_8(string&pOut,char*pText,intpLen);/GB2312轉(zhuǎn)為UTF-81617staticvoidUTF_8ToGB2312(string&pOut,char*pText,intpLen);/UTF-8轉(zhuǎn)為GB23121819;2021類實現(xiàn)2223voidCChineseCode:UTF_8ToUnicode(wchar_t*pOut,char*pText)24252627char*uchar=(char*)pOut;2829

19、uchar1=(pText0&0x0F)2)&0x0F);3031uchar0=(pText1&0x03)4);4647pOut1=(0x80|(pchar1&0x0F)6);4849pOut2=(0x80|(pchar0&0x3F);5051return;52535455voidCChineseCode:UnicodeToGB2312(char*pOut,wchar_tuData)56575859WideCharToMultiByte(CP_ACP,NULL,&uData,1,pOut,sizeof(wchar_t),NULL,NULL);6061return;62636465voidCCh

20、ineseCode:Gb2312ToUnicode(wchar_t*pOut,char*gbBuffer)66676869:MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,gbBuffer,2,pOut,1);7071return;72737475voidCChineseCode:GB2312ToUTF_8(string&pOut,char*pText,intpLen)76777879charbuf4;8081intnLength=pLen*3;8283char*rst=newcharnLength;8485memset(buf,0,4);8687memse

21、t(rst,0,nLength);8889inti=0;9091intj=0;9293while(i=0)100101102103rstj+=pTexti+;104105106107else108109110111wchar_tpbuffer;112113Gb2312ToUnicode(&pbuffer,pText+i);114115UnicodeToUTF_8(buf,&pbuffer);116117unsignedshortinttmp=0;118119tmp=rstj=buf0;120121tmp=rstj+1=buf1;122123tmp=rstj+2=buf2;124125j+=3;

22、126127i+=2;128129130131132133rstj=;134135/返回結(jié)果136137pOut=rst;138139deleterst;140141return;142143144145voidCChineseCode:UTF_8ToGB2312(string&pOut,char*pText,intpLen)146147148149char*newBuf=newcharpLen;150151charCtemp4;152153memset(Ctemp,0,4);154155inti=0;156157intj=0;158159while(i0)164165166167newBuf

23、j+=pTexti+;168169170171else172173174175WCHARWtemp;176177UTF_8ToUnicode(&Wtemp,pText+i);178179UnicodeToGB2312(Ctemp,Wtemp);180181newBufj=Ctemp0;182183newBufj+1=Ctemp1;184185i+=3;186187j+=2;188189190191192193newBufj=;194195pOut=newBuf;196197deletenewBuf;198199return;2002011、將GBK轉(zhuǎn)換成UTF8stringGBKToUTF8(conststd:string&strGBK)stringstrOutUTF8=;WCHAR*str1;intn=MultiByteToWideChar(CP_ACP,0,strGBK.c_str(),-1,NULL,0);str1=newWCHARn;MultiByteToWideChar

溫馨提示

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

最新文檔

評論

0/150

提交評論