1. 程式人生 > >在UTF-8中,一個漢字為什麽需要三個字節?

在UTF-8中,一個漢字為什麽需要三個字節?

ans 所有 硬盤 多個 不足 文字 位置 .com utf

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

在UTF-8中,一個漢字為什麽需要三個字節?