UNICODE是萬能編碼,包含了全部符號的編碼,它規定了全部符號在計算機底層的二進制的表示順序。有關Unicode爲何會出現就不敘述了,Unicode是針對全部計算機的使用者定義一套統一的編碼規範,這樣計算機使用者就避免了編碼轉換的問題。Unicode定義了全部符號的二進制形式,也就是符號如何在計算機內部存儲的,並且每一個符號規定都必須使用兩個字節來表示,也就是用16位二進制去表明一個符號,這樣就致使了一個問題,英文編碼的空間浪費,由於在ANSI中的符號都是一個字節來表示的,而使用了UNICODE編碼就白白浪費了一個字節。也就表明着Unicode須要使用兩倍的空間去存儲相應的ANSI編碼下的符號。雖然如今硬盤或者內存都很廉價,可是在網絡傳輸中,這個問題就凸顯出來了,你能夠這樣想一想,原本1M的帶寬在ANSI下能夠表明1024*1024個字符,可是在Unicode下卻只能表明1024*1024/2個字符。也就是1MB/s的帶寬只能等價於512KB/s,這個很可怕啊。因此爲了解決符號在網絡中傳輸的浪費問題,就出現了UTF-8編碼,Unicode transfer format -8 ,後面的8表明是以8位二進制爲單位來傳輸符號的,可是這樣又致使了一個問題,雖然UTF-8可使用一個字節來表示ANSI下的符號,可是對於其它相似漢語的符號,得須要兩個字節來表示,因此計算機不知道如何去截取一個符號,也就是一個符號對應的二進制的截取開始位置和截取結束位置。因此爲了解決Unicode下的ANSI符號的空間浪費和網絡傳輸下如何截取字符的問題,UTF規定:若是一個符號只佔一個字節,那麼這個8位字節的第一位就爲0。若是爲兩個字節,那麼規定第一個字節的前兩位都爲1,而後第一個字節的第三位爲0,第二個字節的前兩位爲10,而後若是是三個字節的話,那麼第一個字節的前三位爲111,第四位爲0,剩餘的兩個字節的前兩位都爲10。按照這樣的算法去思考一箇中文字符的UTF-8是怎麼表示的:一箇中文字符須要兩個字節來表示,兩個字節一共是16位,那麼UTF-8下,兩個字節是不夠的,由於兩個字節下,第一個字節已經佔據了三位:110,而後剩餘的一個字節佔據了兩位:10,如今就只剩下11位,與Unicode下的兩個字節,16位去表示任意一個字符是相悖的。因此就使用三個字節去表示非ANSI字符:三個字節下,一共是24位,第一個字節頭四位是:1110,後兩個字節的前兩位都是:10,那麼24位-8位=16位,恰好兩個字節去表示Unicode下的任意一個非ANSI字符。這也就是爲何UTF-8須要使用三個字節去表示一個非ANSI字符的緣由了!算法
題外話:網絡
然,中國的漢字多達10多萬,經常使用的漢字3500左右[08年統計],若是用3個字節來表示,一共只有2^16(65535)種可能,不足以表示10多萬的漢字。因此中日韓的超大字符集是採用的4個字節來表示的,多達6萬多個。可是平時使用超大字符集的機率0.01%都不到。因此咱們通常認爲平常的中文在UTF-8中佔三個字節 便可!編碼
多個字節提供的位數超過了所須要的,多餘的位以0補全到編碼前面spa