[計算機原理] 字符編碼的發展歷史

什麼是字符編碼

計算機的最小存儲單元是二進制位,叫做bit,可以表示01兩種狀態,8個連續的二進制位組合出一個字節,叫做byte,可以表示出256種狀態,二進制是0000000011111111,十進制是0 ~ 255

明確兩個概念:

  1. 字節是計算機存儲數據的基本單位!
  2. 字符是人類文明創造的符號,漢字、英文字母、標點符號、特殊符號都是字符。

字符編碼就是在字節和字符之間建立一個映射關係!使得計算機可以用字節存儲字符!

ASCII

計算機起源於二十世紀的美國,美國率先制定出一套字符編碼方案,將33個不可見的控制符號和95個可見的符號(數字、英文大小寫字母、特殊符號)共計128個,與單個字節中0000000001111111128種狀態做了一一對應。這就是著名的ASCII編碼,它是個單字節的編碼方案。

因爲英語的符號很少,所以美國人使用計算機時用ASCII編碼存儲英文信息足夠,但是世界上除了英語,還有漢語和其它地區的語言,這些文明所包含的符號就遠超128個,ASCII編碼最多隻能存儲256個字符,根本就不夠用,這時候就該發明新的編碼方式了。

擴展字符集

剛剛說了一個字節可以表示256種狀態,ASCII編碼佔用了其中128種,還剩128種未被佔用,它們是1000000011111111,把這些空位置再利用上表示新的字符,就誕生了“擴展字符集”編碼。“擴展字符集”現在已經沒有太多實用價值了,基本被淘汰的差不多了。

至此,基於單字節的編碼方案再無新的擴展。

計算機來到中國以後

計算機晚些時候才傳入中國,中國人要用計算機存儲漢語字符。但是,漢語符號太多了,常用漢字就有6000多個,全部漢字加起來要以萬爲單位來計算,採用單字節編碼方案肯定行不通,那就用兩個字節吧,兩個字節有16bit能組合出65536種狀態,嗯,差不多了,能表示很多漢字了。

一個字節可以編碼一個英文字母,兩個字節可以編碼一個漢字。這個時候問題就來了:兩個字節放在你面前,到底是表示一個漢字?還是兩個英文字母?

中國人意識到這是一個規則漏洞!那就再加些規則限制一下:單字節ASCII編碼方案利用了一個字節的前128種狀態,後128種狀態未被利用,那就規定表示漢字的兩個字節必須使用後128種狀態,前面的稱爲高字節,後面的稱爲低字節,高低字節組合起來能表示大約16384種狀態,也就是一萬多個字符,日常夠用。

問題解決了麼?解決了,兩個字節擺在面前,如果字節狀態在前128種之內,就是兩個英文字母,如果字節狀態在後128種之內,就是一個漢字。

兩字節的16384種狀態並沒有全部拿來編碼漢字,漢字只佔用了7000多個常用的,其餘的狀態還編碼了部分數學符號、羅馬希臘字母、日文假名等。不僅如此,ASCII中的數字、標點、字母也被分配有新的狀態,爲了加以區分,原ASCII中單字節字符的叫做“半角”字符,新的雙字節字符叫做“全角”字符。中國人管這種編碼方案叫GB2312,是對ASCII的中文擴展。

慢慢的GB2312的問題也顯露出來,這套編碼只有大約7000個漢字,其它生僻漢字的編碼問題也要解決。那就把GB2312的規則再擴展一下:不再要求低字節必須使用後128種狀態,只要高字節是後128種狀態就行,這樣就又能擴展出大約20000個新狀態,又能表示好多漢字了。這套編碼叫做GBK

少數民族使用計算機後,GBK又擴展出了GB18030編碼,收錄了很多少數民族的語言符號。

中國人發明出來的編碼統稱爲“雙字節字符集”,英語全稱Double Byte Charecter Set,簡稱DBCS,它最大的特點就是單字節編碼和雙字節編碼可以共存!這無意間給中國碼農們造就了一個巨大的bug隱患!敲代碼時要時刻牢記“一個英文佔一個字節的存儲空間,一個漢字佔兩個字節的存儲空間”。

Unicode 全球化進程

到目前爲止,編碼還是區域化的,因爲各地區字符集不同,所以各國家各地區都在使用自己的編碼方案,彼此之間不理解也不支持。中國大陸使用GBK編碼,臺灣使用BIG5編碼,如果大陸計算機要瀏覽臺灣的繁體字網頁,就要先給計算機裝上BIG5編碼,然後才能正確解析臺灣的網頁,否則解析出來的就是一堆亂碼。我就想訪問個網頁,還要先裝個編碼,這真是個煩人的事情!

……

很久以後,出現了一個全球性的非政府組織,叫做國際標準化組織,全稱是International Organization for Standardization,簡稱ISO。他們想解決區域性編碼這個煩人的事情,提出一個解決方案:廢除所有地區性的編碼,重新搞一個全球化的編碼,包含全世界所有的符號!他們給這套編碼方案起了一個響亮的名字Universal Multiple-Octet Coded Character Set,簡稱UCS,俗稱UNICODE。其編碼理論就是把全世界所有字符統一收集起來,給每個符號分配一個編號,從0開始往後遞增,全世界公認這個字符編號。編號就是一個唯一的值,正式名字叫做“碼點”Code Point,其表現形式可以是二進制,也可以是十進制。

全球公認的字符編號就是UNICODE最大的價值所在!它是一套完整的字符集標準,定義了字符與編號之間的映射關係,全世界任何一個字符都能在這裏找到。字符具體的存儲方式規定的也很簡單:單個字符統一用兩個字節或者四個字節存儲。

兩個字節存儲一個字符的方案叫做UCS-2,是UNICODE的一個子集,只能表示出0 ~ 65535這麼多的字符,絕大多數時候夠用。

四個字節存儲一個字符的方案叫做UCS-4,是UNICODE更大範圍的一個子集,能表示出更多的字符,目前足夠容納全世界所有的字符。

無論是UCS-2還是UCS-4都存在一個問題,就是字節空間的浪費,原本一個字節就能存儲的字符現在必須要用兩個或是四個字節。據統計,計算機中使用最多的字符還是英文,ASCII只需要一個字節就能存儲,改用UNICODE就是成倍的浪費。

對於絕大多數人來說,這輩子UCS-2字符集就完全夠用了,所以UNICODE字符集範圍雖然很大很大,但是日常交流中說到UNICODE更多的就是指代UCS-2字符集。

UTF-X 家族

互聯網興起後,事情開始有了新的進展。UNICODE網絡傳輸是必須要思考的,傳輸中大量浪費字節位可不行,於是衆多面向傳輸的UTF(UCS Transfer Format)標準出現了,常見的有:UTF-8UTF-16UTF-32。它們遵循UNICODE字符集標準,但卻改變了它的字節存儲方案。

下面對於UTF的分析就侷限在UCS-2字符集範圍內,UCS-4是同理的。具體存儲細節不展開細說了。

UTF-8最小存儲單位是8bit,也就是一個字節,用它存儲字符,英文只需要一個字節,漢字通常需要三個字節。所以這種編碼方案很適合英文字符集多的場景使用。

UTF-16類似,區別在於最小存儲單位是16bit,也就是兩個字節,存儲英文和漢字都需要兩個字節,所以該方案適合漢字量居多的場景。它和UCS-2的存儲方案很類似,可以說就是一樣的東西。

UTF-32還是類似的,只不過最小存儲單位是四個字節,這是爲UCS-4字符集準備的。

UNICODE本是“字符集定義”和“存儲方案”集於一身的,但是因爲其自身的存儲傳輸效率不高,很長一段時間內,推廣都不是那麼的順利。後來出現的UTF家族提高了存儲傳輸效率,兩者相輔相成,UNICODE得以順利推廣,成爲編碼界的泰山北斗。在現有的體系下,UNICODE代表的是字符集標準,UTF-X代表的是具體的編碼實現。

寫在後面

這是很久以前寫的一篇文章,大概五年前吧,一直沒發出來。

當時看到了一篇別人寫的很好的博客,在那個基礎上加以理解吸收後,形成了自己的這篇博文,是原創,但也算不上是絕對的原創吧。

很可惜,之前看到的那篇博客,我現在已經找不到了,無論如何,感謝那個無名的“前浪”!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章