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

下載本文檔

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

文檔簡(jiǎn)介

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

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

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

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

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

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

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

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

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

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

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

12、節(jié)和低字節(jié)的第1位都是1。BIG5,GBK&GB18030:高字節(jié)的第1位為1。操作系統(tǒng)有默認(rèn)的編碼,常為GBK,可以下載別的并升級(jí)。通過(guò)判斷高字節(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則出錯(cuò)退出return0;nRetLen=:MultiByteToWi

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

14、,NULL,NULL);/獲取轉(zhuǎn)換到UTF8編碼后所需要的字符空間長(zhǎng)度if(!lpUTF8Str)/輸出緩沖區(qū)為空則返回轉(zhuǎn)換后需要的空間大小if(lpUnicodeStr)deletelpUnicodeStr;returnnRetLen;if(nUTF8StrLennRetLen)/如果輸出緩沖區(qū)長(zhǎng)度不夠則退出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;/使用這兩個(gè)函數(shù)的例子intmain()charcGBKStr=我是中國(guó)人!;char*lpGBKStr=NULL;char*lpUTF8Str=NULL;FILE*fp=NULL;intnRetLen=0;nRetLen=GBKToUTF8(unsignedchar*)cGBKStr,NULL,NULL);printf(轉(zhuǎn)換后的字符串需要的空間長(zhǎng)度為:%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();/先去打開(kāi)那個(gè)文本文件看看,單擊記事本的“文件”-“另存為”菜單,在對(duì)話框中看到編碼框變?yōu)榱恕癠TF-8”說(shuō)明轉(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類(lèi)實(shí)現(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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論