1. 程式人生 > >在UTF-8中,一個漢字為什麼需要三個位元組?

在UTF-8中,一個漢字為什麼需要三個位元組?

原文:https://www.cnblogs.com/web21/p/6092414.html

 

  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補全到編碼前面