Unicode 和 UTF-8 的概念是一個很是基礎和重要,可是卻容易被忽略的問題。bash
在計算機系統中,全部的數據都以二進制存儲,全部的運算也以二進制表示,人類語言和符號也須要轉化成二進制的形式,才能存儲在計算機中,因而須要有一個從人類語言到二進制編碼的映射表。這個映射表就叫作字符集。網絡
最先的字符集叫 American Standard Code for Information Interchange(美國信息交換標準代碼),簡稱 ASCII,由 American National Standard Institute(美國國家標準協會)制定。在ASCII 字符集中,字母 A
對應的字符編碼是 65
,轉換成二進制是 0100 0001
,因爲二進制表示比較長,一般使用十六進制 41
。ide
ASCII 字符集總共規定了 128 種字符規範,可是並無涵蓋西文字母以外的字符,當須要計算機顯示存儲中文的時候,就須要一種對中文進行編碼的字符集,GB 2312 就是解決中文編碼的字符集,由國家標準委員會發布。同時考慮到中文語境中每每也須要使用西文字母,GB 2312 也實現了對 ASCII 的向下兼容,原理是西文字母使用和 ASCII 中相同的代碼,可是 GB 2312 只涵蓋了 6000 多個漢字,還有不少沒有包含在其中,因此又出現了 GBK 和 GB 18030,兩種字符集都是在 GB 2312 的基礎上進行了擴展。編碼
能夠看到,光是簡體中文,就前後出現了至少三種字符集,繁體中文方面也有 BIG5 等字符集,幾乎每種語言都須要有一個本身的字符集,每一個字符集使用了本身的編碼規則,每每互不兼容。同一個字符在不一樣字符集下的字符代碼不一樣,這使得跨語言交流的過程當中雙方必需要使用相同的字符編碼才能不出現亂碼的狀況。爲了解決傳統字符編碼的侷限性,Unicode 誕生了,Unicoide 的全稱是 Universal Multiple-Octet Coded Character Set(通用多八位字符集,簡稱 UCS)。Unicode 在一個字符集中包含了世界上全部文字和符號,統一編碼,來終結不一樣編碼產生亂碼的問題。spa
Unicode 統一了全部字符的編碼,是一個 Character Set,也就是字符集,字符集只是給全部的字符一個惟一編號,可是卻沒有規定如何存儲,一個編號爲 65
的字符,只須要一個字節就能夠存下,可是編號 40657
的字符須要兩個字節的空間才能夠裝下,而更靠後的字符可能會須要三個甚至四個字節的空間。code
這時,用什麼規則存儲 Unicode 字符就成了關鍵,咱們能夠規定,一個字符使用四個字節存儲,也就是 32 位,這樣就能涵蓋現有 Unicode 包含的全部字符,這種編碼方式叫作 UTF-32(UTF 是 UCS Transformation Format 的縮寫)。UTF-32 的規則雖然簡單,可是缺陷也很明顯,假設使用 UTF-32 和 ASCII 分別對一個只有西文字母的文檔編碼,前者須要花費的空間是後者的四倍(ASCII 每一個字符只須要一個字節存儲)。orm
在存儲和網絡傳輸中,一般使用更爲節省空間的變長編碼方式 UTF-8,UTF-8 表明 8 位一組表示 Unicode 字符的格式,使用 1 - 4 個字節來表示字符。cdn
UTF-8 的編碼規則以下(U+ 後面的數字表明 Unicode 字符代碼):blog
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 中的全部字符,又能有效減小存儲傳輸過程當中佔用的空間。ip