版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、醫(yī)療事業(yè)部ASCII 是一種字符集,包括大小寫的英文字母、數(shù)字、控制字符等,它用一個字節(jié)表示,范圍是 0-127由于 ASCII 表示的字符非常有限,各個國家或者地區(qū)在此基礎(chǔ)上提出了自己的字符集,比如在中國應(yīng)用非常廣泛的 GB2312,它為漢字提供了編碼,用兩個字節(jié)表示。這些字符集之間互不兼容,相同的數(shù)字可能表示不同的字符,為信息交流帶來了麻煩。Unicode 是一種字符集,它將世界上的所有字符映射成一個唯一的數(shù)字(code point),比如字母 a 對應(yīng)的數(shù)字 0x0041。目前 Unicode 還處于發(fā)展中,它所包容的字符越來越多。在將 Unicode 表示的字符進行存儲時,還需要一定的
2、編碼方式,比如 UCS-2,它用兩個字節(jié)來表示 Unicode 編碼的字符。而 UTF-8 是 Unicode 字符集的另外一種編碼方式,它是變長度的,最多 6 個字節(jié),小于 127 的字符用一個字節(jié)表示,與 ASCII 字符集的結(jié)果一樣,因而具有非常好的兼容性,ASCII 編碼下的英語文本不需要修改就可以當(dāng)作 UTF-8 編碼進行處理,應(yīng)用非常廣泛。Python 從 2.2 開始支持 Unicode ,函數(shù) decode( char_set )可以實現(xiàn) 其它編碼到 Unicode 的轉(zhuǎn)換,函數(shù) encode( char_set )可以實現(xiàn) Unicode 到其它編碼方式的轉(zhuǎn)換,這里所講的 U
3、nicode String 是指 UCS-2 或者 UCS-4 編碼的 Code Points。比如 ("你好").decode( "GB2312") 將得到 u'u4f60u597d',即 "你"和“好"的 Unicode 碼分別是 0x4f60 和 0x597d再用 (u'u4f60u597d').encode("UTF-8") 將得到 'xe4xbdxa0xe5xa5xbd',它是 “你好”的UTF-8編碼結(jié)果。下面就是我的筆記,主要用來整
4、理自己的思路。但是,我盡量試圖寫得通俗易懂,希望能對其他朋友有用。畢竟,字符編碼是計算機技術(shù)的基石,想要熟練使用計算機,就必須懂得一點字符編碼的知識。1. ASCII碼我們知道,在計算機內(nèi)部,所有的信息最終都表示為一個二進制的字符串。每一個二進制位(bit)有0和1兩種狀態(tài),因此八個二進制位就可以組合出256種狀態(tài),這被稱為一個字節(jié)(byte)。也就是說,一個字節(jié)一共可以用來表示256種不同的狀態(tài),每一個狀態(tài)對應(yīng)一個符號,就是256個符號,從0000000到11111111。上個世紀(jì)60年代,美國制定了一套字符編碼,對英語字符與二進制位之間的關(guān)系,做了統(tǒng)一規(guī)定。這被稱為ASCII碼,一直沿用至
5、今。ASCII碼一共規(guī)定了128個字符的編碼,比如空格“SPACE”是32(二進制00100000),大寫的字母A是65(二進制01000001)。這128個符號(包括32個不能打印出來的控制符號),只占用了一個字節(jié)的后面7位,最前面的1位統(tǒng)一規(guī)定為0。2、非ASCII編碼英語用128個符號編碼就夠了,但是用來表示其他語言,128個符號是不夠的。比如,在法語中,字母上方有注音符號,它就無法用ASCII碼表示。于是,一些歐洲國家就決定,利用字節(jié)中閑置的最高位編入新的符號。比如,法語中的é的編碼為130(二進制10000010)。這樣一來,這些歐洲國家使用的編碼體系,可以表示最多256個
6、符號。但是,這里又出現(xiàn)了新的問題。不同的國家有不同的字母,因此,哪怕它們都使用256個符號的編碼方式,代表的字母卻不一樣。比如,130在法語編碼中代表了é,在希伯來語編碼中卻代表了字母Gimel (),在俄語編碼中又會代表另一個符號。但是不管怎樣,所有這些編碼方式中,0127表示的符號是一樣的,不一樣的只是128255的這一段。至于亞洲國家的文字,使用的符號就更多了,漢字就多達10萬左右。一個字節(jié)只能表示256種符號,肯定是不夠的,就必須使用多個字節(jié)表達一個符號。比如,簡體中文常見的編碼方式是GB2312,使用兩個字節(jié)表示一個漢字,所以理論上最多可以表示256x256=65536個符
7、號。中文編碼的問題需要專文討論,這篇筆記不涉及。這里只指出,雖然都是用多個字節(jié)表示一個符號,但是GB類的漢字編碼與后文的Unicode和UTF-8是毫無關(guān)系的。3.Unicode正如上一節(jié)所說,世界上存在著多種編碼方式,同一個二進制數(shù)字可以被解釋成不同的符號。因此,要想打開一個文本文件,就必須知道它的編碼方式,否則用錯誤的編碼方式解讀,就會出現(xiàn)亂碼。為什么電子郵件常常出現(xiàn)亂碼?就是因為發(fā)信人和收信人使用的編碼方式不一樣??梢韵胂?,如果有一種編碼,將世界上所有的符號都納入其中。每一個符號都給予一個獨一無二的編碼,那么亂碼問題就會消失。這就是Unicode,就像它的名字都表示的,這是一種所有符號的
8、編碼。Unicode當(dāng)然是一個很大的集合,現(xiàn)在的規(guī)??梢匀菁{100多萬個符號。每個符號的編碼都不一樣,比如,U+0639表示阿拉伯字母Ain,U+0041表示英語的大寫字母A,U+4E25表示漢字“嚴”。具體的符號對應(yīng)表,可以查詢,或者專門的漢字對應(yīng)表。 4. Unicode的問題需要注意的是,Unicode只是一個符號集,它只規(guī)定了符號的二進制代碼,卻沒有規(guī)定這個二進制代碼應(yīng)該如何存儲。比如,漢字“嚴”的unicode是十六進制數(shù)4E25,轉(zhuǎn)換成二進制數(shù)足足有15位(100111000100101),也就是說這個符號的表示至少需要2個字節(jié)。表示其他更大的符號,可能需要3
9、個字節(jié)或者4個字節(jié),甚至更多。這里就有兩個嚴重的問題,第一個問題是,如何才能區(qū)別unicode和ascii?計算機怎么知道三個字節(jié)表示一個符號,而不是分別表示三個符號呢?第二個問題是,我們已經(jīng)知道,英文字母只用一個字節(jié)表示就夠了,如果unicode統(tǒng)一規(guī)定,每個符號用三個或四個字節(jié)表示,那么每個英文字母前都必然有二到三個字節(jié)是0,這對于存儲來說是極大的浪費,文本文件的大小會因此大出二三倍,這是無法接受的。它們造成的結(jié)果是:1)出現(xiàn)了unicode的多種存儲方式,也就是說有許多種不同的二進制格式,可以用來表示unicode。2)unicode在很長一段時間內(nèi)無法推廣,直到互聯(lián)網(wǎng)的出現(xiàn)。5.UTF
10、-8互聯(lián)網(wǎng)的普及,強烈要求出現(xiàn)一種統(tǒng)一的編碼方式。UTF-8就是在互聯(lián)網(wǎng)上使用最廣的一種unicode的實現(xiàn)方式。其他實現(xiàn)方式還包括UTF-16和UTF-32,不過在互聯(lián)網(wǎng)上基本不用。重復(fù)一遍,這里的關(guān)系是,UTF-8是Unicode的實現(xiàn)方式之一。UTF-8最大的一個特點,就是它是一種變長的編碼方式。它可以使用14個字節(jié)表示一個符號,根據(jù)不同的符號而變化字節(jié)長度。UTF-8的編碼規(guī)則很簡單,只有二條:1)對于單字節(jié)的符號,字節(jié)的第一位設(shè)為0,后面7位為這個符號的unicode碼。因此對于英語字母,UTF-8編碼和ASCII碼是相同的。2)對于n字節(jié)的符號(n>1),第一個字節(jié)的前n位都
11、設(shè)為1,第n+1位設(shè)為0,后面字節(jié)的前兩位一律設(shè)為10。剩下的沒有提及的二進制位,全部為這個符號的unicode碼。下表總結(jié)了編碼規(guī)則,字母x表示可用編碼的位。Unicode符號范圍 | UTF-8編碼方式(十六進制) | (二進制)-+-0000 0000-0000 007F | 0xxxxxxx0000 0080-0000 07FF | 110xxxxx 10xxxxxx0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx下面,還是以
12、漢字“嚴”為例,演示如何實現(xiàn)UTF-8編碼。已知“嚴”的unicode是4E25(100111000100101),根據(jù)上表,可以發(fā)現(xiàn)4E25處在第三行的范圍內(nèi)(0000 0800-0000 FFFF),因此“嚴”的UTF-8編碼需要三個字節(jié),即格式是“1110xxxx 10xxxxxx 10xxxxxx”。然后,從“嚴”的最后一個二進制位開始,依次從后向前填入格式中的x,多出的位補0。這樣就得到了,“嚴”的UTF-8編碼是“11100100 10111000 10100101”,轉(zhuǎn)換成十六進制就是E4B8A5。6. Unicode與UTF-8之間的轉(zhuǎn)換通過上一節(jié)的例子,可以看到“嚴”的Uni
13、code碼是4E25,UTF-8編碼是E4B8A5,兩者是不一樣的。它們之間的轉(zhuǎn)換可以通過程序?qū)崿F(xiàn)。在Windows平臺下,有一個最簡單的轉(zhuǎn)化方法,就是使用內(nèi)置的記事本小程序Notepad.exe。打開文件后,點擊“文件”菜單中的“另存為”命令,會跳出一個對話框,在最底部有一個“編碼”的下拉條。里面有四個選項:ANSI,Unicode,Unicode big endian 和 UTF-8。1)ANSI是默認的編碼方式。對于英文文件是ASCII編碼,對于簡體中文文件是GB2312編碼(只針對Windows簡體中文版,如果是繁體中文版會采用Big5碼)。2)Unicode編碼指的是UCS-2編碼方
14、式,即直接用兩個字節(jié)存入字符的Unicode碼。這個選項用的little endian格式。3)Unicode big endian編碼與上一個選項相對應(yīng)。我在下一節(jié)會解釋little endian和big endian的涵義。4)UTF-8編碼,也就是上一節(jié)談到的編碼方法。選擇完”編碼方式“后,點擊”保存“按鈕,文件的編碼方式就立刻轉(zhuǎn)換好了。7. Little endian和Big endian上一節(jié)已經(jīng)提到,Unicode碼可以采用UCS-2格式直接存儲。以漢字”嚴“為例,Unicode碼是4E25,需要用兩個字節(jié)存儲,一個字節(jié)是4E,另一個字節(jié)是25。存儲的時候,4E在前,25在后,就是
15、Big endian方式;25在前,4E在后,就是Little endian方式。這兩個古怪的名稱來自英國作家斯威夫特的格列佛游記。在該書中,小人國里爆發(fā)了內(nèi)戰(zhàn),戰(zhàn)爭起因是人們爭論,吃雞蛋時究竟是從大頭(Big-Endian)敲開還是從小頭(Little-Endian)敲開。為了這件事情,前后爆發(fā)了六次戰(zhàn)爭,一個皇帝送了命,另一個皇帝丟了王位。因此,第一個字節(jié)在前,就是”大頭方式“(Big endian),第二個字節(jié)在前就是”小頭方式“(Little endian)。那么很自然的,就會出現(xiàn)一個問題:計算機怎么知道某一個文件到底采用哪一種方式編碼?Unicode規(guī)范中定義,每一個文件的最前面分別
16、加入一個表示編碼順序的字符,這個字符的名字叫做”零寬度非換行空格“(ZERO WIDTH NO-BREAK SPACE),用FEFF表示。這正好是兩個字節(jié),而且FF比FE大1。如果一個文本文件的頭兩個字節(jié)是FE FF,就表示該文件采用大頭方式;如果頭兩個字節(jié)是FF FE,就表示該文件采用小頭方式。8. 實例下面,舉一個實例。打開”記事本“程序Notepad.exe,新建一個文本文件,內(nèi)容就是一個”嚴“字,依次采用ANSI,Unicode,Unicode big endian 和 UTF-8編碼方式保存。然后,用文本編輯軟件UltraEdit中的”十六進制功能“,觀察該文件的內(nèi)部編碼方式。1)A
17、NSI:文件的編碼就是兩個字節(jié)“D1 CF”,這正是“嚴”的GB2312編碼,這也暗示GB2312是采用大頭方式存儲的。2)Unicode:編碼是四個字節(jié)“FF FE 25 4E”,其中“FF FE”表明是小頭方式存儲,真正的編碼是4E25。3)Unicode big endian:編碼是四個字節(jié)“FE FF 4E 25”,其中“FE FF”表明是大頭方式存儲。4)UTF-8:編碼是六個字節(jié)“EF BB BF E4 B8 A5”,前三個字節(jié)“EF BB BF”表示這是UTF-8編碼,后三個“E4B8A5”就是“嚴”的具體編碼,它的存儲順序與編碼順序是一致的。字體: 小
18、中 大 | 打印 發(fā)布: 2007-11-15 23:40 作者: 高州人家 來源: 網(wǎng)絡(luò)轉(zhuǎn)載 查看: 1536次 評論: 5條 好評: 21分 ASCII ASCII碼是7位編碼,編碼范圍是0x00-0x7F。ASCII字符集包括英文字母、阿拉伯?dāng)?shù)字和標(biāo)點符號等字符。其中0x00-0x20和0x7F共33個控制字符。 只支持ASCII碼的系統(tǒng)會忽略每個字節(jié)的最高位,只認為低7位是有效位。HZ字符編碼就是早期為了在只支持7位ASCII系統(tǒng)中傳輸中文而設(shè)計的編碼。早
19、期很多郵件系統(tǒng)也只支持ASCII編碼,為了傳輸中文郵件必須使用BASE64或者其他編碼方式。GB2312 GB2312是基于區(qū)位碼設(shè)計的,區(qū)位碼把編碼表分為94個區(qū),每個區(qū)對應(yīng)94個位,每個字符的區(qū)號和位號組合起來就是該漢字的區(qū)位碼。區(qū)位碼一般 用10進制數(shù)來表示,如1601就表示16區(qū)1位,對應(yīng)的字符是“啊”。在區(qū)位碼的區(qū)號和位號上分別加上0xA0就得到了GB2312編碼。 區(qū)位碼中01-09區(qū)是符號、數(shù)字區(qū),16-87區(qū)是漢字區(qū),10-15和88-94是未定義的空白區(qū)。它將收錄的漢字分成兩級:第一級是常用漢字計3755個,
20、置于16-55區(qū),按漢語拼音字母/筆形順序排列;第二級漢字是次常用漢字計3008個,置于56-87區(qū),按部首/筆畫順序排列。一級漢字是按照拼音排序的,這個就可以得到某個拼音在一級漢字區(qū)位中的范圍,很多根據(jù)漢字可以得到拼音的程序就是根據(jù)這個原理編寫的。 GB2312字符集中除常用簡體漢字字符外還包括希臘字母、日文平假名及片假名字母、俄語西里爾字母等字符,未收錄繁體中文漢字和一些生僻字??梢杂梅斌w漢字測試某些系統(tǒng)是不是只支持GB2312編碼。 GB2312的編碼范圍是0xA1A1-0x7E7E,去掉未定義的
21、區(qū)域之后可以理解為實際編碼范圍是0xA1A1-0xF7FE。EUC-CN可以理解為GB2312的別名,和GB2312完全相同。 區(qū)位碼更應(yīng)該認為是字符集的定義,定義了所收錄的字符和字符位置,而GB2312及EUC-CN是實際計算機環(huán)境中支持這種字符集的編碼。HZ和ISO-2022-CN是對應(yīng)區(qū)位碼字符集的另外兩種編碼,都是用7位編碼空間來支持漢字。區(qū)位碼和GB2312編碼的關(guān)系有點像 Unicode和UTF-8。 GBK GBK編碼是GB2312編碼的超集,向下完全兼容GB2312,同時GBK
22、收錄了Unicode基本多文種平面中的所有CJK漢字。同 GB2312一樣,GBK也支持希臘字母、日文假名字母、俄語字母等字符,但不支持韓語中的表音字符(非漢字字符)。GBK還收錄了GB2312不包含的漢字部首符號、豎排標(biāo)點符號等字符。 GBK的整體編碼范圍是為0x8140-0xFEFE,不包括低字節(jié)是0×7F的組合。高字節(jié)范圍是0×81-0xFE,低字節(jié)范圍是0x40-7E和0x80-0xFE。 低字節(jié)是0x40-0x7E的GBK字符有一定特殊性,因為這些字符占用了ASCII碼的位
23、置,這樣會給一些系統(tǒng)帶來麻煩。有些系統(tǒng)中用0x40-0x7E中的字符(如“|”)做特殊符號,在定位這些符號時又沒有判斷這些符號是不是屬于某個 GBK字符的低字節(jié),這樣就會造成錯誤判斷。在支持GB2312的環(huán)境下就不存在這個問題。需要注意的是支持GBK的環(huán)境中小于0x80的某個字節(jié)未必就是ASCII符號;另外就是最好選用小于0×40的ASCII符號做一些特殊符號,這樣就可以快速定位,且不用擔(dān)心是某個漢字的另一半。Big5編碼中也存在相應(yīng)問題。 CP936和GBK的有些許差別,絕大多數(shù)情況下可以把CP936當(dāng)作GBK的別名。 GB1
24、8030 GB18030編碼向下兼容GBK和GB2312,兼容的含義是不僅字符兼容,而且相同字符的編碼也相同。GB18030收錄了所有Unicode3.1中的字符,包括中國少數(shù)民族字符,GBK不支持的韓文字符等等,也可以說是世界大多民族的文字符號都被收錄在內(nèi)。 GBK和GB2312都是雙字節(jié)等寬編碼,如果算上和ASCII兼容所支持的單字節(jié),也可以理解為是單字節(jié)和雙字節(jié)混合的變長編碼。GB18030編碼是變長編碼,有單字節(jié)、雙字節(jié)和四字節(jié)三種方式。GB18030的單字節(jié)編碼范圍是0x00-0x7F,完全等同與ASCI
25、I;雙字節(jié)編碼的范圍和GBK相同,高字節(jié)是0x81-0xFE,低字節(jié)的編碼范圍是0x40-0x7E和0x80-FE;四字節(jié)編碼中第一、三字節(jié)的編碼范圍是0x81-0xFE,二、四字節(jié)是0x30-0x39。 Windows中CP936代碼頁使用0x80來表示歐元符號,而在GB18030編碼中沒有使用0x80編碼位,用其他位置來表示歐元符號。這可以理解為是GB18030向下兼容性上的一點小問題;也可以理解為0x80是CP936對GBK的擴展,而GB18030只是和GBK兼容良好。unicode 每一種語言的不同的編碼頁,增加了那些需要支持不同語言的軟件的復(fù)雜度。因而人們制定了一個世界標(biāo)準(zhǔn),叫做unicode。unicode為每個字符提供了唯一的特定數(shù)值,不論在什么平臺上、不論在什么軟件中,也不論什么語言。也就是說,它世界上使用的所有字符都列出來,并給每一個字符一個唯一特定數(shù)值。Unicode的最初目標(biāo),是用1個16位的編碼來為超過65000字符提供映射。但這還不夠,它不能覆蓋全部歷史上的文字,也不能解決傳輸?shù)膯栴} (implantation head-ache
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 投資合作協(xié)議樣本
- 東風(fēng)商用車合作協(xié)議
- 2025版土地整治項目土地承包協(xié)議3篇
- 2025年西安建工園林工程有限公司招聘筆試參考題庫含答案解析
- 2025年度個人二手房交易合同模板綠色環(huán)保型2篇
- 2025年度定制化個人購房合同范本2篇
- 2025年全球及中國氣動式高壓無氣噴涂機行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報告
- 2025版?zhèn)€人退股協(xié)議書:私募股權(quán)退出及收益分配合同4篇
- 2024年教師資格之中學(xué)綜合素質(zhì)模擬題庫及答案
- 2025年個人二手車買賣合同(帶車輛狀況認證服務(wù))
- 2025貴州貴陽市屬事業(yè)單位招聘筆試和高頻重點提升(共500題)附帶答案詳解
- 2024年住院醫(yī)師規(guī)范化培訓(xùn)師資培訓(xùn)理論考試試題
- 期末綜合測試卷(試題)-2024-2025學(xué)年五年級上冊數(shù)學(xué)人教版
- 招標(biāo)采購基礎(chǔ)知識培訓(xùn)
- 2024年廣東省公務(wù)員錄用考試《行測》試題及答案解析
- 五年級口算題卡每天100題帶答案
- 結(jié)構(gòu)力學(xué)本構(gòu)模型:斷裂力學(xué)模型:斷裂力學(xué)實驗技術(shù)教程
- 2024年貴州省中考理科綜合試卷(含答案)
- 無人機技術(shù)與遙感
- 恩施自治州建始東升煤礦有限責(zé)任公司東升煤礦礦產(chǎn)資源開發(fā)利用與生態(tài)復(fù)綠方案
- PDCA提高臥床患者踝泵運動的執(zhí)行率
評論
0/150
提交評論