基礎(chǔ)知識
計算機(jī)中儲存的信息都是用二進(jìn)制數(shù)表示的;而我們在屏幕上看到的英文灵嫌、漢字等字符是二進(jìn)制數(shù)轉(zhuǎn)換之后的結(jié)果。通俗的說猖凛,按照何種規(guī)則將字符存儲在計算機(jī)中绪穆,如'a'用什么表示辨泳,稱為"編碼";反之菠红,將存儲在計算機(jī)中的二進(jìn)制數(shù)解析顯示出來难菌,稱為"解碼",如同密碼學(xué)中的加密和解密郊酒。在解碼過程中键袱,如果使用了錯誤的解碼規(guī)則摹闽,則導(dǎo)致'a'解析成'b'或者亂碼。
什么是字符集
字符集是書寫系統(tǒng)字母與符號的集合比藻。例如倘屹,ASCII 字符集包括英語字母、符號纽匙;ISO-8859-6字符集包括許多基于阿拉伯語言文字的字母、符號馏段;Unicode 字符集涵蓋世界上多數(shù)活語言文字字符践瓷。
字符集里的字符在計算機(jī)中存儲為一個或多個字節(jié),每一個或每一序列字節(jié)代表一特定字符晕翠。字符編碼關(guān)鍵在將一特定字節(jié)或序列字節(jié)編碼對應(yīng) ( 映射 )以文本字體顯示的特定字符。
什么是字符編碼
字符集只是一個規(guī)則集合的名字硫麻,對應(yīng)到真實生活中樊卓,字符集就是對某種語言的稱呼。例如:英語碌尔,漢語,日語奢赂。對于一個字符集來說要正確編碼轉(zhuǎn)碼一個字符需要三個關(guān)鍵元素:字庫表(character repertoire)颈走、編碼字符集(coded character set)、字符編碼(character encoding form)。其中字庫表是一個相當(dāng)于所有可讀或者可顯示字符的數(shù)據(jù)庫序厉,字庫表決定了整個字符集能夠展現(xiàn)表示的所有字符的范圍毕箍。編碼字符集,即用一個編碼值code point來表示一個字符在字庫中的位置而柑。字符編碼,將編碼字符集和實際存儲數(shù)值之間的轉(zhuǎn)換關(guān)系粹排。一般來說都會直接將code point的值作為編碼后的值直接存儲涩澡。例如在ASCII中A在表中排第65位,而編碼后A的數(shù)值是0100 0001也即十進(jìn)制的65的二進(jìn)制轉(zhuǎn)換結(jié)果射富。 看到這里粥帚,可能很多讀者都會有和我當(dāng)初一樣的疑問:字庫表和編碼字符集看來是必不可少的,那既然字庫表中的每一個字符都有一個自己的序號茎辐,直接把序號作為存儲內(nèi)容就好了掂恕。為什么還要多此一舉通過字符編碼把序號轉(zhuǎn)換成另外一種存儲格式呢?其實原因也比較容易理解:統(tǒng)一字庫表的目的是為了能夠涵蓋世界上所有的字符依啰,但實際使用過程中會發(fā)現(xiàn)真正用的上的字符相對整個字庫表來說比例非常低店枣。例如中文地區(qū)的程序幾乎不會需要日語字符,而一些英語國家甚至簡單的ASCII字庫表就能滿足基本需求鸯两。而如果把每個字符都用字庫表中的序號來存儲的話,每個字符就需要3個字節(jié)(這里以Unicode字庫為例)忙灼,這樣對于原本用僅占一個字符的ASCII編碼的英語地區(qū)國家顯然是一個額外成本(存儲體積是原來的三倍)。算的直接一些酸舍,同樣一塊硬盤,用ASCII可以存1500篇文章啃勉,而用3字節(jié)Unicode序號存儲只能存500篇双妨。于是就出現(xiàn)了UTF-8這樣的變長編碼。在UTF-8編碼中原本只需要一個字節(jié)的ASCII字符枝嘶,仍然只占一個字節(jié)哑诊。而像中文及日語這樣的復(fù)雜字符就需要2個到3個字節(jié)來存儲。