常用字符集簡介

字符集
在計算機系統中,所有的數據都以二進制存儲,所有的運算也以二進制表示,人類語言和符號也需要轉化成二進制的形式,才能存儲在計算機中,於是需要有一個從人類語言到二進制編碼的映射表。這個映射表就叫做字符集。

ASCII
最早的字符集叫 American Standard Code for Information Interchange(美國信息交換標準代碼),簡稱 ASCII,由 American National Standard Institute(美國國家標準協會)制定。在ASCII 字符集中,字母 A 對應的字符編碼是 65,轉換成二進制是 0100 0001,由於二進制表示比較長,通常使用十六進制 41。

GB2312、GBK
ASCII 字符集總共規定了 128 種字符規範,但是並沒有涵蓋西文字母之外的字符,當需要計算機顯示存儲中文的時候,就需要一種對中文進行編碼的字符集,GB 2312 就是解決中文編碼的字符集,由國家標準委員會發布。同時考慮到中文語境中往往也需要使用西文字母,GB 2312 也實現了對 ASCII 的向下兼容,原理是西文字母使用和 ASCII 中相同的代碼,但是 GB 2312 只涵蓋了 6000 多個漢字,還有很多沒有包含在其中,所以又出現了 GBK 和 GB 18030,兩種字符集都是在 GB 2312 的基礎上進行了擴展。

Unicode
可以看到,光是簡體中文,就先後出現了至少三種字符集,繁體中文方面也有 BIG5 等字符集,幾乎每種語言都需要有一個自己的字符集,每個字符集使用了自己的編碼規則,往往互不兼容。同一個字符在不同字符集下的字符代碼不同,這使得跨語言交流的過程中雙方必須要使用相同的字符編碼才能不出現亂碼的情況。爲了解決傳統字符編碼的侷限性,Unicode 誕生了,Unicoide 的全稱是 Universal Multiple-Octet Coded Character Set(通用多八位字符集,簡稱 UCS)。Unicode 在一個字符集中包含了世界上所有文字和符號,統一編碼,來終結不同編碼產生亂碼的問題。

字符編碼 UTF-8
Unicode 統一了所有字符的編碼,是一個 Character Set,也就是字符集,字符集只是給所有的字符一個唯一編號,但是卻沒有規定如何存儲,一個編號爲 65 的字符,只需要一個字節就可以存下,但是編號 40657 的字符需要兩個字節的空間纔可以裝下,而更靠後的字符可能會需要三個甚至四個字節的空間。

這時,用什麼規則存儲 Unicode 字符就成了關鍵,我們可以規定,一個字符使用四個字節存儲,也就是 32 位,這樣就能涵蓋現有 Unicode 包含的所有字符,這種編碼方式叫做 UTF-32(UTF 是 UCS Transformation Format 的縮寫)。UTF-32 的規則雖然簡單,但是缺陷也很明顯,假設使用 UTF-32 和 ASCII 分別對一個只有西文字母的文檔編碼,前者需要花費的空間是後者的四倍(ASCII 每個字符只需要一個字節存儲)。

在存儲和網絡傳輸中,通常使用更爲節省空間的變長編碼方式 UTF-8,UTF-8 代表 8 位一組表示 Unicode 字符的格式,使用 1 - 4 個字節來表示字符。

UTF-8 的編碼規則如下(U+ 後面的數字代表 Unicode 字符代碼):
U+ 0000 ~ U+ 007F: 0XXXXXXX
U+ 0080 ~ U+ 07FF: 110XXXXX 10XXXXXX
U+ 0800 ~ U+ FFFF: 1110XXXX 10XXXXXX 10XXXXXX
U+10000 ~ U+1FFFF: 11110XXX 10XXXXXX 10XXXXXX 10XXXXXX
可以看到,UTF-8 通過開頭的標誌位位數實現了變長。對於單字節字符,只佔用一個字節,實現了向下兼容 ASCII,並且能和 UTF-32 一樣,包含 Unicode 中的所有字符,又能有效減少存儲傳輸過程中佔用的空間。

END

發佈了58 篇原創文章 · 獲贊 13 · 訪問量 8324
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章