版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、字符編碼知識(shí):Unicode、UTF-8、ASCII、GB2312等編碼之間是如何轉(zhuǎn)換的?(.字符編碼是計(jì)算機(jī)技術(shù)的基石,想要熟練使用計(jì)算機(jī),就必須懂得字符編碼的知識(shí)。不注意的人可能對(duì)這個(gè)不在意,但這些名詞有時(shí)候?qū)嵲谧屓嗣曰?,?duì)想學(xué)習(xí)計(jì)算機(jī)知識(shí)的人來(lái)說(shuō),搞懂它也十分重要,我也是在學(xué)習(xí)中慢慢了解了一些這方面的知識(shí)。1. ASCII碼 在計(jì)算機(jī)內(nèi)部,所有的信息最終都表示為一個(gè)二進(jìn)制的字符串。每一個(gè)二進(jìn)制位(bit)有0和1兩種狀態(tài),因此八個(gè)二進(jìn)制位就可以組合出256種狀態(tài),這被稱為一個(gè)字節(jié)(byte)。也就是說(shuō),一個(gè)字節(jié)一共可以用來(lái)表示256種不同的狀態(tài),每一個(gè)狀態(tài)對(duì)應(yīng)一個(gè)符號(hào),就是256個(gè)符號(hào),
2、從0000000到11111111。上個(gè)世紀(jì)60年代,美國(guó)制定了一套字符編碼,對(duì)英語(yǔ)字符與二進(jìn)制位之間的關(guān)系,做了統(tǒng)一規(guī)定。這被稱為ASCII碼,一直沿用至今。ASCII碼一共規(guī)定了128個(gè)字符的編碼,比如空格“SPACE”是32(十進(jìn)制的32,用二進(jìn)制表示就是00100000),大寫的字母A是65(二進(jìn)制01000001)。這128個(gè)符號(hào)(包括32個(gè)不能打印出來(lái)的控制符號(hào)),只占用了一個(gè)字節(jié)的后面7位,最前面的1位統(tǒng)一規(guī)定為0。下面是截圖:具體的可以到這個(gè)網(wǎng)頁(yè)上去查下: 2、非ASCII編碼英語(yǔ)用128個(gè)符號(hào)編碼就夠了,但是用來(lái)表示其他語(yǔ)言,128個(gè)符號(hào)是不夠的。比如,在法語(yǔ)中,字母上方有注
3、音符號(hào),它就無(wú)法用ASCII碼表示。于是,一些歐洲國(guó)家就決定,利用字節(jié)中閑置的最高位編入新的符號(hào)。比如,法語(yǔ)中的的編碼為130(二進(jìn)制10000010)。這樣一來(lái),這些歐洲國(guó)家使用的編碼體系,可以表示最多256個(gè)符號(hào)。但是,這里又出現(xiàn)了新的問(wèn)題。不同的國(guó)家有不同的字母,因此,哪怕它們都使用256個(gè)符號(hào)的編碼方式,代表的字母卻不一樣。比如,130在法語(yǔ)編碼中代表了,在希伯來(lái)語(yǔ)編碼中卻代表了字母Gimel (),在俄語(yǔ)編碼中又會(huì)代表另一個(gè)符號(hào)。但是不管怎樣,所有這些編碼方式中,0127表示的符號(hào)是一樣的,不一樣的只是128255的這一段。至于亞洲國(guó)家的文字,使用的符號(hào)就更多了,漢字就多達(dá)10萬(wàn)左右
4、。一個(gè)字節(jié)只能表示256種符號(hào),肯定是不夠的,就必須使用多個(gè)字節(jié)表達(dá)一個(gè)符號(hào)。比如,簡(jiǎn)體中文常見(jiàn)的編碼方式是GB2312,使用兩個(gè)字節(jié)表示一個(gè)漢字,所以理論上最多可以表示256x256=65536個(gè)符號(hào)。3.Unicode正如上一節(jié)所說(shuō),世界上存在著多種編碼方式,同一個(gè)二進(jìn)制數(shù)字可以被解釋成不同的符號(hào)。因此,要想打開(kāi)一個(gè)文本文件,就必須知道它的編碼方式,否則用錯(cuò)誤的編碼方式解讀,就會(huì)出現(xiàn)亂碼。為什么電子郵件常常出現(xiàn)亂碼?就是因?yàn)榘l(fā)信人和收信人使用的編碼方式不一樣。解釋:同一個(gè)文本文件,假設(shè)內(nèi)容是用英語(yǔ)寫的,在英語(yǔ)編碼的情況下,每個(gè)字符會(huì)和一個(gè)二進(jìn)制數(shù)對(duì)應(yīng)(如00101000類似),然后存到計(jì)算
5、機(jī)中,這時(shí)把這個(gè)英語(yǔ)文件發(fā)給一個(gè)俄語(yǔ)國(guó)家的用戶,計(jì)算機(jī)傳輸?shù)氖嵌M(jìn)制流,即0101之類的數(shù)據(jù),到了俄語(yǔ)用戶這方,需要有它的俄語(yǔ)編碼方式進(jìn)行解碼,把每個(gè)二進(jìn)制流轉(zhuǎn)為字符顯示,由于俄語(yǔ)編碼表中對(duì)每串二進(jìn)制流數(shù)據(jù)的解釋方式不同,同一個(gè)數(shù)據(jù)如00101000在英語(yǔ)中可能代表A,而在俄語(yǔ)中則代表B,這樣就會(huì)產(chǎn)生亂碼,這是我個(gè)人的理解。GB2312編碼、日文編碼等也是非unicode編碼,是要通過(guò)轉(zhuǎn)換表(codepage)轉(zhuǎn)換成unicode編碼的,要不怎么顯示出來(lái)呢?可以想象,如果有一種編碼,將世界上所有的符號(hào)都納入其中。每一個(gè)符號(hào)都給予一個(gè)獨(dú)一無(wú)二的編碼,那么亂碼問(wèn)題就會(huì)消失。這就是Unicode,就
6、像它的名字都表示的,這是一種所有符號(hào)的編碼。Unicode當(dāng)然是一個(gè)很大的集合,現(xiàn)在的規(guī)??梢匀菁{100多萬(wàn)個(gè)符號(hào)。每個(gè)符號(hào)的編碼都不一樣,比如,U+0639表示阿拉伯字母Ain,U+0041表示英語(yǔ)的大寫字母A,U+4E25表示漢字“嚴(yán)”。具體的符號(hào)對(duì)應(yīng)表,可以查詢,或者專門的。4. Unicode的問(wèn)題需要注意的是,Unicode只是一個(gè)符號(hào)集,只是一種規(guī)范、標(biāo)準(zhǔn),它只規(guī)定了符號(hào)的二進(jìn)制代碼,卻沒(méi)有規(guī)定這個(gè)二進(jìn)制代碼應(yīng)該如何存儲(chǔ)在計(jì)算機(jī)上。比如,漢字“嚴(yán)”的unicode是十六進(jìn)制數(shù)4E25,轉(zhuǎn)換成二進(jìn)制數(shù)足足有15位(100111000100101),也就是說(shuō)這個(gè)符號(hào)的表示至少需要2個(gè)字
7、節(jié)。表示其他更大的符號(hào),可能需要3個(gè)字節(jié)或者4個(gè)字節(jié),甚至更多。這里就有兩個(gè)嚴(yán)重的問(wèn)題,第一個(gè)問(wèn)題是,如何才能區(qū)別unicode和ascii?計(jì)算機(jī)怎么知道三個(gè)字節(jié)表示一個(gè)符號(hào),而不是分別表示三個(gè)符號(hào)呢?第二個(gè)問(wèn)題是,我們已經(jīng)知道,英文字母只用一個(gè)字節(jié)表示就夠了,如果unicode統(tǒng)一規(guī)定,每個(gè)符號(hào)用三個(gè)或四個(gè)字節(jié)表示,那么每個(gè)英文字母前都必然有二到三個(gè)字節(jié)是0,這對(duì)于存儲(chǔ)來(lái)說(shuō)是極大的浪費(fèi),文本文件的大小會(huì)因此大出二三倍,這是無(wú)法接受的。它們?cè)斐傻慕Y(jié)果是:1)出現(xiàn)了unicode的多種存儲(chǔ)方式,也就是說(shuō)有許多種不同的二進(jìn)制格式,可以用來(lái)表示unicode。2)unicode在很長(zhǎng)一段時(shí)間內(nèi)無(wú)法
8、推廣,直到互聯(lián)網(wǎng)的出現(xiàn)。5.UTF-8互聯(lián)網(wǎng)的普及,強(qiáng)烈要求出現(xiàn)一種統(tǒng)一的編碼方式。UTF-8就是在互聯(lián)網(wǎng)上使用最廣的一種unicode的實(shí)現(xiàn)方式。其他實(shí)現(xiàn)方式還包括UTF-16和UTF-32,不過(guò)在互聯(lián)網(wǎng)上基本不用。重復(fù)一遍,這里的關(guān)系是,UTF-8是Unicode的實(shí)現(xiàn)方式之一,它規(guī)定了字符如何在計(jì)算機(jī)中存儲(chǔ)、傳輸?shù)?。UTF-8最大的一個(gè)特點(diǎn),就是它是一種變長(zhǎng)的編碼方式。它可以使用14個(gè)字節(jié)表示一個(gè)符號(hào),根據(jù)不同的符號(hào)而變化字節(jié)長(zhǎng)度。UTF-8的編碼規(guī)則很簡(jiǎn)單,只有二條:1)對(duì)于單字節(jié)的符號(hào),字節(jié)的第一位設(shè)為0,后面7位為這個(gè)符號(hào)的unicode碼。因此對(duì)于英語(yǔ)字母,UTF-8編碼和ASC
9、II碼是相同的。2)對(duì)于n字節(jié)的符號(hào)(n1),第一個(gè)字節(jié)的前n位都設(shè)為1,第n+1位設(shè)為0,后面字節(jié)的前兩位一律設(shè)為10。剩下的沒(méi)有提及的二進(jìn)制位,全部為這個(gè)符號(hào)的unicode碼。下表總結(jié)了編碼規(guī)則,字母x表示可用編碼的位。Unicode符號(hào)范圍 | UTF-8編碼方式(十六進(jìn)制) | (二進(jìn)制)-+-0000 0000-0000 007F | 0xxxxxxx0000 0080-0000 07FF | 110xxxxx 10xxxxxx0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx0001 0000-0010 FFFF | 11110xxx
10、 10xxxxxx 10xxxxxx 10xxxxxx下面,還是以漢字“嚴(yán)”為例,演示如何實(shí)現(xiàn)UTF-8編碼。已知“嚴(yán)”的unicode是4E25(100111000100101),根據(jù)上表,可以發(fā)現(xiàn)4E25處在第三行的范圍內(nèi)(0000 0800-0000 FFFF),因此“嚴(yán)”的UTF-8編碼需要三個(gè)字節(jié),即格式是“1110xxxx 10xxxxxx 10xxxxxx”。然后,從“嚴(yán)”的最后一個(gè)二進(jìn)制位開(kāi)始,依次從后向前填入格式中的x,多出的位補(bǔ)0。這樣就得到了,“嚴(yán)”的UTF-8編碼是“11100100 10111000 10100101”,這是保存在計(jì)算機(jī)中的實(shí)際數(shù)據(jù),轉(zhuǎn)換成十六進(jìn)制就是
11、E4B8A5,轉(zhuǎn)成十六進(jìn)制的目的為了便于閱讀。6. Unicode與UTF-8之間的轉(zhuǎn)換通過(guò)上一節(jié)的例子,可以看到“嚴(yán)”的Unicode碼是4E25,UTF-8編碼是E4B8A5,兩者是不一樣的。它們之間的轉(zhuǎn)換可以通過(guò)程序?qū)崿F(xiàn)。在Windows平臺(tái)下,有一個(gè)最簡(jiǎn)單的轉(zhuǎn)化方法,就是使用內(nèi)置的記事本小程序Notepad.exe。打開(kāi)文件后,點(diǎn)擊“文件”菜單中的“另存為”命令,會(huì)跳出一個(gè)對(duì)話框,在最底部有一個(gè)“編碼”的下拉條。里面有四個(gè)選項(xiàng):ANSI,Unicode,Unicode big endian 和 UTF-8。1)ANSI是默認(rèn)的編碼方式。對(duì)于英文文件是ASCII編碼,對(duì)于簡(jiǎn)體中文文件是G
12、B2312編碼(只針對(duì)Windows簡(jiǎn)體中文版,如果是繁體中文版會(huì)采用Big5碼)。2)Unicode編碼指的是UCS-2編碼方式,即直接用兩個(gè)字節(jié)存入字符的Unicode碼。這個(gè)選項(xiàng)用的little endian格式。3)Unicode big endian編碼與上一個(gè)選項(xiàng)相對(duì)應(yīng)。我在下一節(jié)會(huì)解釋little endian和big endian的涵義。4)UTF-8編碼,也就是上一節(jié)談到的編碼方法。選擇完”編碼方式“后,點(diǎn)擊”保存“按鈕,文件的編碼方式就立刻轉(zhuǎn)換好了。7. Little endian和Big endian上一節(jié)已經(jīng)提到,Unicode碼可以采用UCS-2格式直接存儲(chǔ)。以漢字”
13、嚴(yán)“為例,Unicode碼是4E25,需要用兩個(gè)字節(jié)存儲(chǔ),一個(gè)字節(jié)是4E,另一個(gè)字節(jié)是25。存儲(chǔ)的時(shí)候,4E在前,25在后,就是Big endian方式;25在前,4E在后,就是Little endian方式。那么很自然的,就會(huì)出現(xiàn)一個(gè)問(wèn)題:計(jì)算機(jī)怎么知道某一個(gè)文件到底采用哪一種方式編碼?Unicode規(guī)范中定義,每一個(gè)文件的最前面分別加入一個(gè)表示編碼順序的字符,這個(gè)字符的名字叫做”零寬度非換行空格“(ZERO WIDTH NO-BREAK SPACE),用FEFF表示。這正好是兩個(gè)字節(jié),而且FF比FE大1。如果一個(gè)文本文件的頭兩個(gè)字節(jié)是FE FF,就表示該文件采用大頭方式;如果頭兩個(gè)字節(jié)是F
14、F FE,就表示該文件采用小頭方式。8. 實(shí)例下面,舉一個(gè)實(shí)例。打開(kāi)”記事本“程序Notepad.exe,新建一個(gè)文本文件,內(nèi)容就是一個(gè)”嚴(yán)“字,依次采用ANSI,Unicode,Unicode big endian 和 UTF-8編碼方式保存。然后,用文本編輯軟件的”十六進(jìn)制功能“,觀察該文件的內(nèi)部編碼方式。1)ANSI:文件的編碼就是兩個(gè)字節(jié)“D1 CF”,這正是“嚴(yán)”的GB2312編碼,這也暗示GB2312是采用大頭方式存儲(chǔ)的。2)Unicode:編碼是四個(gè)字節(jié)“FF FE 25 4E”,其中“FF FE”表明是小頭方式存儲(chǔ),真正的編碼是4E25。3)Unicode big endian
15、:編碼是四個(gè)字節(jié)“FE FF 4E 25”,其中“FE FF”表明是大頭方式存儲(chǔ)。4)UTF-8:編碼是六個(gè)字節(jié)“EF BB BF E4 B8 A5”,前三個(gè)字節(jié)“EF BB BF”表示這是UTF-8編碼,后三個(gè)“E4B8A5”就是“嚴(yán)”的具體編碼,它的存儲(chǔ)順序與編碼順序是一致的。推薦這篇文章看一下: 9.解決的問(wèn)題:一、如何在中文系統(tǒng)中運(yùn)行非Unicode編碼程序?有很多意大利文版(除英文版)學(xué)習(xí)軟件、百科全書等軟件在中文系統(tǒng)上會(huì)出現(xiàn)亂碼,解決方法: WindowsXP內(nèi)核是Unicode編碼,支持多語(yǔ)種,對(duì)于Unicode編碼的應(yīng)用程序會(huì)正常顯示原文(因?yàn)閣indows核心是用unicod
16、e代碼寫的,所以不存在問(wèn)題),但是,很多程序不是用Unicode編碼寫的,這時(shí)WindowsXP系統(tǒng)可以指定以特定的編碼運(yùn)行非Unicode編碼程序,中文版WindowsXP默認(rèn)的是“簡(jiǎn)體中文GB2312”。你只需在控制面板-區(qū)域和語(yǔ)言選項(xiàng)-高級(jí)-為非Unicode程序的語(yǔ)言選擇“意大利語(yǔ)”,即可正確運(yùn)行意大利文版的游戲程序。分析:我理解的流程是這樣:程序-意大利語(yǔ)編碼(轉(zhuǎn)換表codepage)-解釋成unicode識(shí)別的編碼(通過(guò)指定的轉(zhuǎn)換表將非 Unicode 的字符編碼轉(zhuǎn)換為同一字符對(duì)應(yīng)的系統(tǒng)內(nèi)部使用的 Unicode 編碼)-被系統(tǒng)翻譯成意大利文(因?yàn)槊總€(gè)unicode編碼對(duì)應(yīng)了相應(yīng)的
17、意大利文字),便可以正常顯示了。二、消除網(wǎng)頁(yè)亂碼?網(wǎng)頁(yè)亂碼是瀏覽器對(duì)HTML網(wǎng)頁(yè)解釋時(shí)形成的,如果網(wǎng)頁(yè)制作時(shí)編碼為繁體big5,瀏覽器卻以編碼gb2312顯示該網(wǎng)頁(yè),就會(huì)出現(xiàn)亂碼,因此只要你在瀏覽器中也以繁體big5顯示該網(wǎng)頁(yè),就會(huì)消除亂碼。打個(gè)比方有些像字典,繁體字得用繁體字典來(lái)查看,簡(jiǎn)體字得用簡(jiǎn)體字典來(lái)查看,不然你看不懂。 【解決辦法】:在瀏覽器中選擇“編碼”菜單,事先為瀏覽器安裝多語(yǔ)言支持包(例如在安裝IE時(shí)要安裝多語(yǔ)言支持包),這樣當(dāng)瀏覽網(wǎng)頁(yè)出現(xiàn)亂碼時(shí),即可手工更改查看此網(wǎng)頁(yè)的編碼方式,在瀏覽器中選擇菜單欄下的“查看”/“編碼”/“自動(dòng)選擇”/簡(jiǎn)體中文(GB2312),如為繁體中文則選擇“
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 購(gòu)銷合同的范本(2篇)
- 股東項(xiàng)目風(fēng)險(xiǎn)劃分合同(2篇)
- 南京工業(yè)大學(xué)浦江學(xué)院《稅法二》2023-2024學(xué)年第一學(xué)期期末試卷
- ××機(jī)械有限責(zé)任公司高效礦井重型刮板輸送機(jī)成套設(shè)備安全驗(yàn)收?qǐng)?bào)告(機(jī)械)
- 芳香烴說(shuō)課稿
- 渭塘劉玨路組織設(shè)計(jì)
- 《中 國(guó)石拱橋》第課時(shí)說(shuō)課稿
- 《乙醇》的說(shuō)課稿
- 南京工業(yè)大學(xué)浦江學(xué)院《公共事業(yè)管理概論》2023-2024學(xué)年第一學(xué)期期末試卷
- 簡(jiǎn)單兩人散伙協(xié)議書(2篇)
- 事故管理臺(tái)帳
- Meeting Minutes(會(huì)議記錄模板)參考模板
- excel教學(xué)精選PPT課件
- 國(guó)家開(kāi)放大學(xué)《商務(wù)英語(yǔ)3》形考任務(wù)1-8參考答案
- 車間主任績(jī)效考核表
- 置換混凝土施工方案
- 公路工程工地試驗(yàn)室標(biāo)準(zhǔn)化試驗(yàn)檢測(cè)項(xiàng)目、參數(shù)檢驗(yàn)頻率一覽表
- 應(yīng)用地球化學(xué)元素特征判別沉積環(huán)境
- 人教版四年級(jí)下冊(cè)語(yǔ)文第三單元測(cè)試卷及答案(2)
- 田麥久《運(yùn)動(dòng)訓(xùn)練學(xué)》(第2版)配套題庫(kù)(含考研真題)
- 商務(wù)英語(yǔ)教學(xué)課件:unit5 Travel and Visits
評(píng)論
0/150
提交評(píng)論