bit
:位,一個位就表明一個 0 或 1,二進制單位。數據傳輸大可能是以「位」爲單位,例如:100Mbps 即 Mbit/s,兆比特每秒。byte
:字節,計算機中用於計量存儲容量的一種計量單位。html
關係:8 bit
s = 1 byte
算法
ASCII,/ˈæski/,American Standard Code for Information Interchange
美國信息交換標準代碼編碼
每個 bit 有 0 和 1 兩種狀態,所以八個二進制位就能夠組合出 256 種狀態,這被稱爲一個 byte。也就是說,一個字節一共能夠用來表示 256 種不一樣的狀態,每個狀態對應一個符號,就是 256 個符號,從 0000000 到 11111111。spa
ASCII 碼一共規定了 128 個字符的編碼(ASCII 對照表),這 128 個符號只佔用了一個字節的後面 7 位,最前面的 1 位統一規定爲 0。.net
英語字母及一些符號用 128 個符號編碼就足夠了,可是用來表示其餘語言,128 個符號是遠遠不夠。設計
Unicode 是爲了解決傳統的字符編碼方案的侷限而產生的,它爲每種語言中的每一個字符設定了統一而且惟一的二進制編碼,以知足跨語言、跨平臺進行文本轉換、處理的要求。
code
在表示一個 Unicode 字符時,一般會用 U+
而後緊接着一組十六進制的數字來表示這一個字符。例如:U+0041
表示英語大寫字母 A
,U+4E25
表示漢字 「嚴」。orm
Unicode 是一個符號集。Unicode 的實現方式不一樣於編碼方式。一個字符的 Unicode 編碼是肯定的,可是在實際傳輸過程當中,因爲不一樣系統平臺的設計不必定一致,對 Unicode 編碼的實現方式有所不一樣。Unicode的實現方式稱爲 Unicode 轉換格式(Unicode Transformation Format,簡稱爲 UTF)。htm
Unicode 字符的十六進制數轉換成二進制數時,通常用 2 個字節表示 1 個字符,表示其餘更偏的字符,可能須要 3 或 4 個字節,甚至更多。blog
若是一個僅包含 7 bits 的 ASCII 字符(例如一個英文字母)使用 Unicode 編碼,若是 Unicode 統一規定每一個字符都使用 2 個或更多字節表示,那麼這些字節中前幾個字節就必然要補 0。雖然亂碼問題獲得解決,可是這對於存儲來講是極大的浪費。
例如:字母 A 的 Unicode 二進制編碼是 00000000 01000001
。
UTF-8 是 Unicode 的一種實現方式。其餘實現方式還包括 UTF-16 和 UTF-32。
UTF-8 是一種變長編碼,根據具體字符來變動所需的表示字節。它將基本 7 位 ASCII 字符仍用 7 位編碼表示,佔用一個字節(首位補 0)。而遇到與其餘 Unicode 字符混合的狀況,將按必定算法轉換,每一個字符使用 1-3 個字節編碼,並利用首位爲 0 或 1 進行識別。這樣對以 ASCII 字符爲主的英文文檔就大幅節省了編碼長度。
UTF-8 的編碼規則只有二條:
對於 128 個 ASCII 字符只需一個字節表示,字節的第一位補 0,後面 7 位爲這個字符的 ASCII 二進制數。Unicode 範圍爲 U+0000 至U+007F。
對於 n 字節的符號(n>1),第一個字節的前 n 位都設爲 1,第 n+1 位設爲 0,後面字節的前兩位一概設爲 10。剩下的沒有說起的二進制位,所有爲這個符號的 Unicode 碼二進制數。Unicode 範圍由 U+0080 起。
下表總結了編碼規則,字母 x 表示可用編碼的位。
Unicode 範圍 (十六進制) |
UTF-8 編碼 (二進制) |
---|---|
U+0000 ~ U+007F | 0xxxxxxx |
U+0080 ~ U+07FF | 110xxxxx 10xxxxxx |
U+0800 ~ U+FFFF | 1110xxxx 10xxxxxx 10xxxxxx |
U+10000 ~ U+10FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
註釋:十六進制 007F 轉換十進制爲 127,二進制爲 01111111。
以漢字「嚴」爲例,演示如何實現 UTF-8 編碼。
"嚴"的 Unicode 是 U+4E25(二進制數 100111000100101),據表,U+4E25 處在第三行的範圍內(U+0800 ~ U+FFFF),所以「嚴」的UTF-8 編碼須要三個字節,即格式 1110xxxx 10xxxxxx 10xxxxxx
。而後,從「嚴」的最後一個二進制位開始,依次從後向前填入格式中的 x
,多出的位補 0。這樣就獲得 UTF-8 編碼(二進制)是 11100100 10111000 10100101
,轉換成十六進制就是 E4B8A5
。
下圖也總結了上述的編碼規則。