【字符編碼系列】字符,字符集,字符編碼解惑

引言

這是每個程序員都應該無條件掌握的知識!

寫在前面的話

在涉及到任何字符編碼操做前,得先對字符編碼有所瞭解,要否則只多是知其然而不知其因此然。html

本文屬於 字符編碼系列文章之一,更多請前往 字符編碼系列程序員

基本概念

字符

各類文字和符號的總稱,包括各國家文字、標點符號、圖形符號、數字等。
也就是說,它是一個信息單位,一個數字是一個字符,一個文字是一個字符,一個標點符號也是一個字符。segmentfault

字節

字節是一個8bit的存儲單元,取值範圍是0x00~0xFF。
根據字符編碼的不一樣,一個字符能夠是單個字節的,也能夠是多個字節的。編碼

字符集

字符的集合就叫字符集。不一樣集合支持的字符範圍天然也不同,譬如ASCII只支持英文,GB18030支持中文等等spa

在字符集中,有一個碼錶的存在,每個字符在各自的字符集中對應着一個惟一的碼。可是同一個字符在不一樣字符集中的碼是不同的,譬如字符「中」在Unicode和GB18030中就分別對應着不一樣的碼(2001354992)。設計

字符編碼

定義字符集中的字符如何編碼爲特定的二進制數,以便在計算機中存儲。
字符集和字符編碼通常一一對應(有例外)3d

譬如GB18030既能夠表明字符集,也能夠表明對應的字符編碼,它爲了兼容ASCII碼,編碼方式爲code大於255的採用兩位字節(或4字節)來表明一個字符,不然就是兼容模式,一個字節表明一個字符。(簡單一點理解,將它認爲是如今用的的中文編碼就好了)代理

字符集與字符編碼的一個例外就是Unicode字符集,它有多種編碼實現(UTF-8,UTF-16,UTF-32等)code

簡要介紹

下面舉些示例方便快速理解。htm

字符集與字符編碼的快速區分

  • ASCII碼是一個字符集,同時它的實現也只有一種,所以它也能夠指代這個字符集對應的字符編碼
  • GB18030是一個字符集,主要是中國人爲了解決中文而發明制定的,因爲它的實現也只有一種,因此它也能夠指代這個字符集對應的字符編碼
  • Unicode是一個字符集,爲了解決不一樣字符集碼錶不一致而推出的,統一了全部字符對應的碼,所以在這個規範下,全部字符對應的碼都是一致的(統一碼),可是統一碼只規定了字符與碼錶的一一對應關係,卻沒有規定該如何實現,所以這個字符集有多種實現方式(UTF-8,UTF-18,UTF-32),所以這些實現就是對應的字符編碼。

也就是說,Unicode統一約定了字符與碼錶直接一一對應的關係,而UTF-8是Unicode字符集的一種字符編碼實現方式,它規定了字符該如何編碼成二進制,存儲在計算機中。

字符集與字符編碼發展簡史

這段資料主要借鑑了參考連接中的描述,只對大概發展作一個簡要概述,每個編碼的詳細介紹請參考系列文章目錄裏的其它文章。

歐美的單字節字符編碼發展

  • 美國人發明了計算機,使用的是英文,因此一開始就設計了一個幾乎只支持英文的字符集ASCII碼(1963 發佈),有128個碼位,用一個字節便可表示,範圍爲00000000-01111111
  • 後來發現碼位不夠,因而在這基礎上進行拓展,256個字符,取名爲EASCII(Extended ASCII),也能一個字節表示,範圍爲00000000-11111111
  • 後來傳入歐洲,發現這個標準並不適用於一些歐洲語言,因而在ASCII(最原始的ASCII)的基礎上拓展,造成了ISO-8859標準(國際標準,1998年發佈),跟EASCII相似,兼容ASCII。而後,根據歐洲語言的複雜特性,結合各自的地區語言造成了N個子標準,ISO-8859-一、ISO-8859-二、...

兼容性簡直使人髮指。

亞洲,只能雙字節了

  • 計算機傳入亞洲後,國際標準已被徹底不夠用,東亞語言隨便一句話就已經超出範圍了,也是這時候亞洲各個國家根據本身的地區特點,有發明了本身地圖適用的字符集與編碼,譬如中國大陸的GB2312,中國臺灣的BIG5,日本的Shift JIS等等

這些編碼都是用雙字節來進行存儲,它們對外有一個統稱(ANSI-American National Standards Institute),也就是說GB2312或BIG5等都是ANSI在各自地區的不一樣標準。

Unicode,一統天下

  • 到了全球互聯網時代,不一樣國家,不一樣地區須要進行交互,這時候因爲各自編碼標準都不同,彼此之間都是亂碼,沒法良好的溝通交流,因而這時候ISO組織與統一碼聯盟分別推出了UCS(Universal Multiple-Octet Coded Character Set)與Unicode。後來,二者意識到沒有必要用兩套字符集,因而進行了一次整合,到了Unicode2.0時代,Nnicode的編碼和UCS的編碼都基本一致(因此後續爲了簡便會贊成用Unicode指代),這時候全部的字符均可以採用同一個字符集,有着相同的編碼,能夠愉快的進行交流了。
  • 須要注意的是UCS標準有本身的格式,如UCS-2(雙字節),UCS-4(四字節)等等

而Unicode也有本身的不一樣編碼實現,如UTF-8,UTF-16,UTF-32等等
其中UTF-16能夠認爲是UCS-2的拓展,UTF-32能夠認爲是UCS-4的拓展,而Unicode能夠認爲是Unicode最終用來制霸互聯網的一種編碼格式。

在中國,GB系列的發展

  • 在計算機傳入中國後,1980年,中國國家標準總局發佈了第一個漢字編碼國家標準GB2312(2312是標準序號),採用雙字節編碼,裏面包括了大部分漢字,拉丁字母,日文假名以及全角字符等。
  • 然而,隨着程序的發展,逐漸發現GB2312已經不知足需求了,因而1993年又推出了一個GBK編碼(漢字國標擴展碼),徹底兼容GB2312標準。而且包括了BIG5的全部漢字,與1995年發佈。

同時GBK也涵蓋了Unicode全部CJK漢字,因此也能夠和Unicode作一一對應。

  • 後來到了2000年,又推出了一個全新的標準 GB 18030,它不只拓展了新的字符,如支持中國少數名族文字等,並且它採用了單字節,雙字節,四字節三種編碼方式,因此徹底兼容ASCII碼與GBK碼。

到了2005年,這一標準有進行了拓展,推出了GB18030-2005,劇本涵蓋全部漢字,也就是說,如今使用的國標標準碼就是GB18030-2005了。

不一樣字符編碼的字符是如何進行轉換的

  • 若是是相同字符集,因爲相同字符集中的碼都是同樣的,因此只須要針對不一樣的編碼方式轉變而已。譬如UTF-16轉UTF-8,首先會取到當前須要轉換的字符的Unicode碼,而後將當前的編碼方式由雙字節(有4字節的拓展就不贅述了),變爲變長的1,2,3等字節
  • 若是是不一樣的字符集,因爲不一樣字符集的碼是不同的,因此須要各自的碼錶才能進行轉換。譬如UTF-16轉GBK,首先須要取到當前須要轉換的字符的Unicode碼,而後根據Unicode和GBK碼錶一一對應的關係(只有部分共同都有的字符才能在碼錶中查到),找到它對應的GBK碼,而後用GBK的編碼方式(雙字節)進行編碼

編年史

注意,此編年史引用自來源連接中的內容(作了部分修改與更新)-http://www.jianshu.com/p/bd7a6c508c33

  • ASCII
    1960 開發
    1963 發佈
    1986 最後一次更新
  • ISO-8859-1
    1998 發佈
  • GB2312
    1980 發佈
  • GBK
    1993 發佈
  • GB18030
    2000年3月17日發佈 GB18030-2000
    2001年的1月強制執行GB18030-2000
    2005年發佈GB18030-2005
  • UCS與Unicode
    1984年 UCS開始制定標準
    1991年10月 Unicode1.0發佈
    1992年1月 Unicode與ISO 10646國際編碼標準正式合做,發展一套通用 編碼標準
    1993年 ISO組織發表UCS(標準編號ISO 10646)國際編碼標準的第一個版 本
    1993年6月 修訂了Unicode 1.0,發佈Unicode 1.1
    1996 年7月 發佈Unicode2.0(實現了代理機制(UTF-16),這時候Unicode和UCS能夠近似認爲同樣
  • UTF-16
    1996年7月 發佈
  • UTF-8
    1993 發佈
    1996年 微軟的CAB(MS Cabinet)在UTF-8標準正式落實前就明確允許在任何地方使用UTF-8編碼系統
    2008 流行

UTF-8制霸互聯網過程

附錄

博客

初次發佈2017.05.03於我的博客

http://www.dailichun.com/2017/05/03/char_charset_charEncoding.html

參考資料

相關文章
相關標籤/搜索