字符编码的历史与发展(ASCII, GBK, Unicode)
比特與字節(jié)
帶著問題學(xué)本節(jié)?
- 為什么比特位的值是 0 和1?
- 為什么一個(gè)字節(jié)要包含8個(gè)比特位?
比特,也稱比特位, bit,是計(jì)算機(jī)最小的存儲單位,比特位的值是0或者1 。為什么是0和1呢?
這是由電子硬件的物理性質(zhì), 可以想象電流要么是開,要么是關(guān)。而且二進(jìn)制在效率和成本上有優(yōu)勢。馮諾依曼結(jié)構(gòu)的數(shù)字計(jì)算機(jī)采用二進(jìn)制數(shù)。
byte ,字節(jié), 是訪問內(nèi)存的最小單位,是可以用來表示一個(gè)完整的字符的,那為什么一個(gè)字節(jié)是8個(gè)二進(jìn)制位呢? 這也要追溯計(jì)算機(jī)發(fā)展歷史了。
最早的計(jì)算機(jī)有 4-bit、6-bit、7-bit 等,到了1964年,IBM 設(shè)計(jì)出IBM System/360大型機(jī),取得重大成功。而System/360的一個(gè)byte就是 8-bit。這里就需要提到一個(gè)名字了 Frederick Phillips Brooks,Jr (弗雷德里克·布魯克斯),其也是大名鼎鼎的《人月神話》的作者。
布魯克斯和8比特的字節(jié)有什么關(guān)系呢?
布魯克斯自己曾經(jīng)說過: “我做出的最重要的決定是將IBM 360系列從6位更改為8位字節(jié),從而允許使用小寫字母。這種變化傳播到了所有地方。”
這里只是解釋了8比特字節(jié)的由來, 并沒有說到為什么是8比特,而不是7比特,或者16比特。
因?yàn)橛?jì)算機(jī)最早發(fā)展是在美國, 上面也說到字節(jié)是用來表示完整字符, 在英語中, 大小寫英文字母總共52個(gè),加上其他的一些字符使用7個(gè)比特位就能表示 128個(gè)字符, 對于英語來說足夠了, 當(dāng)然如果用100個(gè)比特表示一個(gè)字符也可以, 但是這樣會浪費(fèi)。 總共8個(gè)比特,最高位為符號位, 其他7位用來表示字符,看起來剛剛好, 而且8比特正好是2的冪,于是8比特字節(jié)逐漸流行,美國也在此之上推出了一個(gè)標(biāo)準(zhǔn)American Standard Code for Information Interchange,美國信息互換標(biāo)準(zhǔn)代碼,也就是經(jīng)常聽見的Ascii編碼。
ASCII、GB2312、GBK與Unicode 、UTF
帶著問題學(xué)本節(jié)?
- 半角與全角
- UTF是什么? 與Unicode 的關(guān)系是什么?
ASCII 是美國國家標(biāo)準(zhǔn)協(xié)會(ANSI)定義的一個(gè)使用8個(gè)比特位表示字符的編碼,比如大寫字母A的十進(jìn)制編碼是65, 對應(yīng)的二進(jìn)制的編碼是:01100101。完整的定義是:
- 第0~32號及第127號(共34個(gè))是控制字符或通訊專用字符
- 第33~126號(共94個(gè))是字符
隨著字符使用的增多,127號之后的空位也逐漸來表示新的字母、符號,還加入了很多畫表格時(shí)需要用下到的橫線、豎線、交叉等形狀,一直把序號編到了最后一個(gè)狀態(tài)255。從128到255這一頁的字符集被稱"擴(kuò)展字符集"。
但是不管怎么增加, 對于逐漸參與使用計(jì)算機(jī)以及在該領(lǐng)域發(fā)揮重要重要的中國來說, 256個(gè)字符要用來表示所有的漢字遠(yuǎn)遠(yuǎn)不夠,因?yàn)闈h字的總數(shù)超過6000多, 于是聰明的中國人想到了一個(gè)辦法:
一個(gè)小于127的字符的意義與原來相同,但兩個(gè)大于127的字符連在一起時(shí),就表示一個(gè)漢字,前面的一個(gè)字節(jié)(他稱之為高字節(jié))從0xA1用到 0xF7,后面一個(gè)字節(jié)(低字節(jié))從0xA1到0xFE,這樣我們就可以組合出大約7000多個(gè)簡體漢字了
這樣的話,把數(shù)學(xué)符號、羅馬希臘的字母、日文的假名們都編進(jìn)去了,連在 ASCII 里本來就有的數(shù)字、標(biāo)點(diǎn)、字母都統(tǒng)統(tǒng)重新編了兩個(gè)字節(jié)長的編碼,這就是常說的"全角"字符,而原來在127號以下的那些就叫"半角"字符了。
這套編碼規(guī)則, 就叫GB2312,詳細(xì)可以參考: GB2312字符表。
但是后來發(fā)現(xiàn), GB2312的編碼方式還是不夠用,于是不再要求低字節(jié)一定是127號之后的內(nèi)碼,只要第一個(gè)字節(jié)是大于127就固定表示這是一個(gè)漢字的開始,不管后面跟的是不是擴(kuò)展字符集里的內(nèi)容。這種擴(kuò)展之后的編碼方案被稱為 GBK 標(biāo)準(zhǔn),詳細(xì)可以參考:GBK表字符表。
隨著中國少數(shù)名族的使用電腦的要求, 少數(shù)名字的字又有幾千個(gè)需要編碼,于是又將GBK 擴(kuò)展成GB18030。
美國有ASCII編碼, 中國大陸有GK2312和GBK編碼, 中國臺灣有BIG5編碼, 其他的國家和地區(qū)又定義了自己的編碼標(biāo)準(zhǔn),全世界那么多國家,如果每個(gè)國家都定義一套標(biāo)準(zhǔn), 想想吧, 太亂了。 于是國際標(biāo)準(zhǔn)化組織(ISO)出手了, 廢除所有地區(qū)的編碼方案, 制定一個(gè)包含全球所有文化、字母和符號的編碼, 稱作Universal Multiple-Octet Coded Character Set",簡稱 UCS, 俗稱 “UNICODE”。
UNICODE規(guī)定使用16位來統(tǒng)一表示所有的字符,對于ascii里的那些"半角"字符,UNICODE 包持其原編碼不變,只是將其長度由原來的8位擴(kuò)展為16位,而其他文化和語言的字符則全部重新統(tǒng)一編碼。由于"半角"英文符號只需要用到低8位,所以其高 8位永遠(yuǎn)是0,因此這種大氣的方案在保存英文文本時(shí)會多浪費(fèi)一倍的空間。
UNICODE 是用兩個(gè)字節(jié)來表示為一個(gè)字符,他總共可以組合出65535不同的字符,這大概已經(jīng)可以覆蓋世界上所有文化的符號。如果還不夠也沒有關(guān)系,ISO已經(jīng)準(zhǔn)備了UCS-4方案,就是四個(gè)字節(jié)來表示一個(gè)字符,這樣我們就可以組合出21億個(gè)不同的字符。
需要注意的是:UNICODE 在制訂時(shí)沒有考慮與任何一種現(xiàn)有的編碼方案保持兼容,這使得 GBK 與UNICODE 在漢字的內(nèi)碼編排上完全是不一樣的,沒有一種簡單的算術(shù)方法可以把文本內(nèi)容從UNICODE編碼和另一種編碼進(jìn)行轉(zhuǎn)換,這種轉(zhuǎn)換必須通過查表來進(jìn)行。
UTF-8編碼是一種多字節(jié)編碼,也是目前互聯(lián)網(wǎng)應(yīng)用最廣泛的一種Unicode編碼方式。最大特點(diǎn)就是可變長,可根據(jù)字符的不同變換長度。一個(gè)英文字符占用一個(gè)字節(jié),一個(gè)中文(含繁體)占用三個(gè)字節(jié)。英文標(biāo)點(diǎn)占用1個(gè)字節(jié),中文標(biāo)點(diǎn)同樣占用3個(gè)字節(jié)。UTF-8包含了全世界所有國家需要用到的字符,是國際編碼,通用性極強(qiáng)。使用這種編碼的話,一旦文章中同時(shí)出現(xiàn)中文、英文或者繁體,瀏覽器都會支持,而不會出現(xiàn)亂碼。
總結(jié)
以上是生活随笔為你收集整理的字符编码的历史与发展(ASCII, GBK, Unicode)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 异常处理python 空气质量问题_Py
- 下一篇: 13、控件使用之GBK录入文本显示、二维