前言
你是不是工作了很多年了,一直沒搞清楚計算機(jī)中的各種編碼規(guī)則,雖然平時都會使用,但是內(nèi)部機(jī)制原理一直都是之其然而不知其所以然,開發(fā)中也會經(jīng)常涉及到這塊內(nèi)容,但都沒有太多重視,這可能會讓有吃一些虧(出項目bug了),本著追本溯源的精神或是為了讓自己在少出血bug,小余今天就來聊聊這塊內(nèi)容。
目錄
1.字符集與字符編碼
首先要明確兩概念, 字符集 (charset)和 字符編碼 (encoding)。
字符集
字符集顧名思義: 很多字符的集合 。這些字符組成一套字符系統(tǒng),用來表達(dá)我們生活中各種含義,
比如0~9以及各種加減法等符號的集合,可以表示生活中的“數(shù)字集合”,不然1+1是什么計算機(jī)可不知道? 26個大小寫英文字母加上標(biāo)點(diǎn)符號就組成了“英文字符集“,這些字符集在英美人看來就組成了一套符號系統(tǒng),看到”I Love you“就知道什么意思了。 再比如我們新華字典中的所有漢字加上標(biāo)點(diǎn)符號就組成了“中文字符集”,這個字符集就組成了中文文字系統(tǒng)??吹健拔覑勰恪币簿椭朗裁匆馑剂?,可以對于不懂中文的老外來,因?yàn)闆]有中文字符集,看到“我愛你”可就一臉懵逼了。
字符編碼
字符編碼 :言外之意就是 對字符進(jìn)行編碼 ,那為什么要對字符編碼,其實(shí)字符編碼最終目的就是為了存儲或者傳輸。我們的計算機(jī)最早是用來提供算術(shù)功能的,和算盤功能類似,但是后來發(fā)現(xiàn)計算機(jī)可以做很多事情。 其中就包括存儲機(jī)制,如何存儲呢?假設(shè)“LOVE”這個單詞,我們使用數(shù)字1代表L,數(shù)字2代表O,數(shù)字3代表V,數(shù)字4代表E,將1234存儲在某個區(qū)域,這樣就可以知道這4個數(shù)字代表了“LOVE”,當(dāng)然實(shí)際LOVE有自己的字符表示,這里使用1234作為例講解。
字符編碼的四個步驟
要在計算機(jī)中建立一個“字符編碼模型”,需要四個步驟:
- 1.要有一個 字符庫 ,確定這些字符庫足夠表意。比如ASCII字符集,已經(jīng)足夠表示英文系統(tǒng),但是不能表達(dá)中文,于是有了GB2312字符集。
-
- 第一層編碼 :給每個字符選個數(shù)字(Code Point),比如ASCII碼中,用65表示“A”,97表示“a”。
-
- 第二層編碼 :確定表示字符的二進(jìn)制位數(shù)(8位,16位,32位)。ASCII碼使用7位來表示,因?yàn)楫?dāng)時制定者覺得7位以及夠用了,DBCS(雙字節(jié)字符集)使用了16位。
- 4.第三層編碼: 確定字符的二進(jìn)制存儲方式(大端還是小端)。比如X86機(jī)器使用小端。
一個字符一般只有一種編碼格式,當(dāng)字符集中的字符不夠用時,會增加一些新的字符,使用新的字符編碼格式,形成新的字符集。所以 有時候字符集和字符編碼的概念是很模糊的,并不嚴(yán)格區(qū)分 。比如ASCII碼既可以成為一段“字符集”,也可以稱為一種“編碼格式”。
也有一些字符集有多種編碼格式:如Unicode,其中UTF-8和UTF-16等都是其編碼格式,這個后面是詳細(xì)講解。
2.常用計算機(jī)編碼
1.ASCII碼
ASCII碼全稱“American Standard Code for Information Interchange”, 美國標(biāo)準(zhǔn)信息交互碼 ,由美國標(biāo)準(zhǔn)委員會(American Standards Association,簡稱ASA)制定,后來該協(xié)會改組為“美國國家標(biāo)準(zhǔn)學(xué)會”(American National Standard Institute , 簡稱ANSI ),所以很多資料上說ASCII碼是由ANSI指定的。
ASCII碼是從電報碼發(fā)展過來的,最早使用在7-bits電傳打印機(jī)上。1960年,ASA將ASCII標(biāo)準(zhǔn)化,于1963年發(fā)布第一版,1967年再發(fā)布一次大的版本,這個標(biāo)準(zhǔn)版本,也是一個7-bit碼,包含33個非打印字符(現(xiàn)在許多已經(jīng)廢棄了),95個打印字符(包含空格符),編碼范圍為0~127。
然而ASCII碼只是美國的標(biāo)準(zhǔn),對于其他國家,如中文,日文,韓文等大多使用的是象形文字,127個字符遠(yuǎn)遠(yuǎn)無法表達(dá)中國的漢字文化,于是各國在ASCII的基礎(chǔ)上制定了自己的字符集,但是 本質(zhì)上都兼容ASCII ,如中國大陸的GK2312,臺灣省的(Big5)小日子的JIS等編碼規(guī)范。
2.EASCII
其實(shí)標(biāo)準(zhǔn)的ASCII就是7-bit的編碼(8字節(jié),但是最高位沒有編碼),后來使用過程中發(fā)現(xiàn)127個字符有點(diǎn)不夠用,于是將ASCII進(jìn)行了擴(kuò)展,叫做EASCII或者h(yuǎn)igh-ASCII,8位的,能表示256個字符。
由于不同的應(yīng)用場景,有不同的編碼,有IBM的Extend ASCII和ANSI的Extend ASCII。 去wikipedia上會發(fā)現(xiàn)有好多種ASCII的標(biāo)準(zhǔn),大類就是IBM和ANSI(Windows的,微軟很強(qiáng)勢,ANSI的東西感覺就是給他們家用的)兩種,其實(shí)都是為了給自家系統(tǒng)用的,隨著IBM操作系統(tǒng)的墜落,IBM的擴(kuò)展ASCII也根本上淡出視野。
擴(kuò)展的ASCII的產(chǎn)生
搭載Windows系統(tǒng)的計算機(jī)進(jìn)入歐洲之后,發(fā)現(xiàn)標(biāo)準(zhǔn)的ASCII并不能滿足歐洲這些拉丁語族國家的語言表意,決定對其進(jìn)行擴(kuò)展。同為印歐語系,發(fā)現(xiàn)擴(kuò)展起來也沒那么難,總共256個值就包括所有了。只需要將原來的7-bit擴(kuò)展為8-bit,將原來的標(biāo)準(zhǔn)ASCII保留,第一位使用0來表示。將擴(kuò)展的字符第一位使用1來表示
擴(kuò)展ASCII的組成
具體來講,擴(kuò)展后的ASCII碼表可以看成 由三部分組成 :
- 第一部分 :由00H到1FH共32個,一般用來通訊或作為控制之用。有些可以顯示在屏幕上,有些則不能顯示,但能看到其效果(如換行、退格)
- 第二部分 :是由20H到7FH共96個,這95個字符是用來表示阿拉伯?dāng)?shù)字、英文字母大小寫和下劃線、括號等符號,都可以顯示在屏幕上.
- 第三部分 :由80H到0FFH共128個字符,一般稱為"擴(kuò)充字符",這128個擴(kuò)充字符是由IBM制定的,并非標(biāo)準(zhǔn)的ASCII碼.這些字符是用來表示框線、音標(biāo)和其它歐洲非英語系的字母。
3.ISO-8859
由于每個國家以及公司對編碼的各自定制化,導(dǎo)致 同一個字符在不同電腦之間由于編碼的不一致,顯示的結(jié)果也不一樣,現(xiàn)象就是亂碼 。 那為了解決這個問題,ISO組織統(tǒng)一了一套標(biāo)準(zhǔn)的字符集。
與ASCII、EASCII字符編碼方案只包括單個獨(dú)立的字符集不同,ISO/IEC 8859字符編碼方案包括了一組字符集, 或者說ISO/IEC 8859相當(dāng)于是一組字符集的總稱,其內(nèi)共包含了15個字符集, 即ISO/IEC 8859-n,n=1、2、3…15、16,其中12未定義,所以實(shí)際上共15個。
這15個字符集,大致上包括了歐洲各國所使用到的字符(甚至還包括一些外來語字符),而且每一個字符集的補(bǔ)充擴(kuò)展部分(即除了兼容ASCII字符之外的部分),都只實(shí)際使用了0xA00xFF(十進(jìn)制為160255)這96個編碼,而0x800x9F(十進(jìn)制為128159)這32個編碼并未實(shí)際定義字符。
其中,目前使用得最為普遍的是ISO/IEC 8859-1字符集,收錄了西歐常用字符(包括德法兩國的字母)。
ISO/IEC 8859-1往往簡稱為ISO 8859-1,而且還有一個稱之為Latin-1(也寫作Latin1)的別名,即:ISO/IEC 8859-1 = ISO 8859-1 = Latin-1 = Latin1。
從ISO 8859-1到ISO 8859-16各自所收錄的字符分別如下:
ISO/IEC 8859-1 (Latin-1) - 西歐語言
ISO/IEC 8859-2 (Latin-2) - 中歐語言
ISO/IEC 8859-3 (Latin-3) - 南歐語言。世界語也可用此字符集顯示。
ISO/IEC 8859-4 (Latin-4) - 北歐語言
ISO/IEC 8859-5 (Cyrillic) - 斯拉夫語言
ISO/IEC 8859-6 (Arabic) - 阿拉伯語
ISO/IEC 8859-7 (Greek) - 希臘語
ISO/IEC 8859-8 (Hebrew) - 希伯來語(視覺順序)
ISO 8859-8-I - 希伯來語(邏輯順序)
ISO/IEC 8859-9(Latin-5 或 Turkish)- 它把Latin-1的冰島語字母換走,加入土耳其語字母。
ISO/IEC 8859-10(Latin-6 或 Nordic)- 北日耳曼語支,用來代替Latin-4。
ISO/IEC 8859-11 (Thai) - 泰語,從泰國的 TIS620 標(biāo)準(zhǔn)字集演化而來。
ISO/IEC 8859-13(Latin-7 或 Baltic Rim)- 波羅的語族
ISO/IEC 8859-14(Latin-8 或 Celtic)- 凱爾特語族
ISO/IEC 8859-15 (Latin-9) - 西歐語言,加入Latin-1欠缺的芬蘭語字母和大寫法語重音字母,以及歐元(€)符號。
ISO/IEC 8859-16 (Latin-10) - 東南歐語言。主要供羅馬尼亞語使用,并加入歐元符號。
-
計算機(jī)
+關(guān)注
關(guān)注
19文章
7360瀏覽量
87633 -
編碼
+關(guān)注
關(guān)注
6文章
932瀏覽量
54731 -
BUG
+關(guān)注
關(guān)注
0文章
155瀏覽量
15639
發(fā)布評論請先 登錄
相關(guān)推薦
評論