平時我們經(jīng)常會遇到各種各樣的字符編碼,最常見的就是 ASCII
髓梅、UTF-8
除此之外還有 GB2312
褒脯、GBK
、EASCII
等等很多的字符編碼坟募。我們經(jīng)常提到的Unicode
是一個字符集岛蚤,并不是一種字符編碼方案。但是這些編碼方案到底是如何將字符編碼的懈糯,對應(yīng)的歷史發(fā)展關(guān)系又是怎樣的呢涤妒?
字符集術(shù)語
在講述字符編碼之前,這里統(tǒng)一一下字符集術(shù)語赚哗。這部分是純概念的部分她紫,不感興趣的同學(xué)可以直接跳過這部分。
-
字符
字符是指字母屿储、數(shù)字贿讹、標(biāo)點、表意文字(比如漢語)扩所、符號围详,或其他文本形式的書寫"原子"。由統(tǒng)一字符集(Universal Character Set, UCS)
首創(chuàng),為多種語言中的很多字符開發(fā)了一系列標(biāo)準(zhǔn)化的文本名稱助赞,它們常用來便捷的命名字符买羞,而且不會與其他字符沖突。 -
字形
描述字符的筆畫圖案或唯一的圖形化形狀雹食。 -
編碼后的字符
分配給字符的唯一數(shù)字編號畜普,這樣我們就可以操作它了。 -
編碼空間
計劃用于字符編碼的整數(shù)范圍群叶。 -
編碼寬度
每個(固定大小的)字符編碼所用的位數(shù)吃挑。 -
字符集
特定的工作字符集(全體字符的一個子集)。 -
編碼后的字符集
組成字符庫(從全球的字符中選出若干字符)的已編碼字符集街立,并為每個字符分配編碼空間的一個代碼舶衬。換句話說,它把數(shù)字化的字符代碼映射為實際的字符赎离。 -
字符編碼方案
把數(shù)字化的字符代碼編碼成一系列二進制碼(并能相應(yīng)地反向解碼)的算法逛犹。
各種編碼方案的歷史及編碼方式
計算機首先是在美國發(fā)明出來的,為了使美國常用的一些字符能在計算機中進行操作梁剔,他們就對美國現(xiàn)有的字符進行編碼虽画。首先出現(xiàn)的比較規(guī)范的編碼方案就是ASCII碼
。
ASCII碼
ASCII碼 (American Standard Code for Information Interchange荣病,美國信息交換標(biāo)準(zhǔn)代碼)
這種編碼方案采用一個字節(jié)表示一個字符码撰,一個字節(jié) 8
個 bit
位 2^8
可以表示 256
個狀態(tài),但是其中只使用了 128
個狀態(tài)个盆,最高位始終為 0
脖岛。其中 0 ~ 31
表示控制字符,32 ~ 126
表示可顯示的字符砾省,127
表示刪除鸡岗。ASCII碼對照表。在美國這個字符編碼方案是夠用的编兄,但是隨著計算機的發(fā)展轩性,傳到了其他國家,其他國家的一些字符并沒有在這套編碼方案內(nèi)狠鸳,當(dāng)然也就無法顯示和控制了揣苏。人們就想起了剩下的那 128
個沒有使用的狀態(tài)對目前的 ASCII碼
進行擴展,這就是EASCII(Extended ASCII件舵,延伸美國標(biāo)準(zhǔn)信息交換碼)
卸察。
EASCII碼
EASCII碼
有很多種,比較常見的有 CP437
铅祸,ISO/IEC 8859系列
坑质。他共同特點就是前 128
位的狀態(tài)和 ASCII碼
是一樣的合武。而后面的則根據(jù)不同的國家對應(yīng)編不同的字符,這樣就解決了很多國家的字符編碼問題。但是到了亞洲大多采用表意文字涡扼,比如漢字多達幾千上萬的字符稼跳,這樣這套編碼方案就又不能適應(yīng)了。所以就又出現(xiàn)了其他的編碼方案吃沪,例如中文編碼方案 GB2312
汤善、GBK
等等各種不同的編碼方案。下面以GB2312
為例講解這類編碼方案票彪。
GB2312
由于漢字眾多红淡,單字節(jié)的狀態(tài)位已經(jīng)不夠用,所以中國人老實不客氣的在加一個字節(jié)這樣 2
個字節(jié) 16
位降铸,最多就可表示 2^16 = 65536
個狀態(tài)在旱。GB2312
是基于區(qū)位碼設(shè)計的,區(qū)位碼把編碼表分為 94
個區(qū)垮耳,每個區(qū)對應(yīng)
94
位颈渊,每個字符的區(qū)號和位號組合起來就是該漢字的區(qū)位碼。區(qū)位碼一般用十進制數(shù)來表示终佛,如 1601
就表示 16
區(qū) 1
位,對應(yīng)的字符是"啊"雾家。在區(qū)位碼的區(qū)號和位號上分別加上 0xA0
就得到了 GB2312
的編碼铃彰,比如字符"啊"的編碼就是 0xB0A1
。GB2312簡體中文編碼表芯咧。其中有很多的狀態(tài)位是沒有使用的牙捉,
GB2312
的編碼范圍是 0xA1A1~0xFEFE
,就算是這個編碼范圍內(nèi)的也有很多是沒有使用的敬飒。后來的 GBK
邪铲、GB18030
等都是在此基礎(chǔ)上,又增添了其他的一些字符无拗,這里不做具體敘述带到。
Unicode
隨著越來越多的編碼方案出現(xiàn),相互之間的交流變得復(fù)雜起來英染。這時 Unicode
出現(xiàn)了揽惹,Unicode字符表它把世界上所有的字符都對應(yīng)起來一個編碼。但 Unicode
僅僅只是一個字符集四康,它只規(guī)定了符號的二進制代碼搪搏,卻沒有規(guī)定這個二進制代碼應(yīng)該如何編碼存儲。后續(xù)對此字符集進行編碼闪金,提出了不同的編碼方案疯溺,其中有 UTF-8
,UTF-16
, UTF-32
囱嫩。下面以 UTF-8
為例講解恃疯。
UTF-8
UTF-8(Unicode Transformation Format - 8)
,UTF-8
使用的是變寬編碼挠说,不像上面提到的澡谭,說是一個字節(jié)或兩個字節(jié)的長度,則所有的字符都是那么長损俭。
UTF-8
占用最小占用 1
個字節(jié)蛙奖,最大占用 6
個字節(jié)。編碼方式為:
字符代碼的二進制位 | 字節(jié)1 | 字節(jié)2 | 字節(jié)3 | 字節(jié)4 | 字節(jié)5 | 字節(jié)6 |
---|---|---|---|---|---|---|
0~7 | 0xxxxxxx | |||||
8~11 | 110xxxxx | 10xxxxxx | ||||
12~16 | 1110xxxx | 10xxxxxx | 10xxxxxx | |||
17~21 | 11110xxx | 10xxxxxx | 10xxxxxx | 10xxxxxx | ||
22~26 | 111110xx | 10xxxxxx | 10xxxxxx | 10xxxxxx | 10xxxxxx | |
27~31 | 1111110x | 10xxxxxx | 10xxxxxx | 10xxxxxx | 10xxxxxx | 10xxxxxx |
舉例來說明一下杆兵,Unicode
中字符代碼 90(字符為" Z ")
的二進制碼為1011010
7位
雁仲,這對應(yīng)的編碼就是一個字節(jié)長度,01011010琐脏。Unicode
中字符代碼 5073(字符" ? ")
的二進制碼為 1001111010001
13位
的則需要用三個字節(jié)攒砖。編碼后為11100001 10001111 10010001。
總結(jié)
像 ASCII碼
這些日裙,既是字符集吹艇,又是編碼方案,而 Unicode
僅僅是一個字符集昂拂,并不是一個編碼方案受神。我們最常用的編碼方案就是 ASCII碼
和 UTF-8
。而大多數(shù)的編碼方案都是兼容 ASCII碼
的格侯。這里只是在眾多的編碼方案中鼻听,挑出幾種來介紹,如果對其他的一些編碼方案感興趣联四,可以自己再去查閱有關(guān)資料撑碴。這是一系列文章的其中一篇,你可以在這兒Encode & Decode集序找到他其他的兄弟朝墩。
參考
- 陳娟,趙振平[譯]. HTTP權(quán)威指南:人名郵電出版社
- 常用字符集編碼詳解:ASCII 醉拓、GB2312、GBK鱼辙、GB1803...