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