1. 程式人生 > >UTF8編碼-變長編碼

UTF8編碼-變長編碼

我相信很多很我一樣做挨踢業的人在初期都免不了遇上亂碼之類的問題,相信在很多次之後都會對編碼有些瞭解,其實編碼和很多這方面的知識一樣,你乍一看他挺繁瑣,晦澀難懂。不過只要你理解了其中的必然性,從制定者的角度去考慮一些東西,就會發現一切都順理成章。

首先要說明的是我們所有的資訊都是以二進位制位元組的形式儲存的,比如00000000這樣的8個0就代表一個位元組了。8個位元組一共有256中變化,不能用來表示我們大千世界的所有文字,(想想中文就知道了)。

所以為了能有一種編碼表示所有的語言,文字,那我們就得加長位數,比如全世界有256*256*256*256個不同的文字,那麼我們就得用32位二進位制來表示。

但是可能一些英語國家就吃虧了,因為他們明明用一個位元組就能說清楚問題,但是因為要配合我們,卻要用好四個位元組,他們國家的朋友們的硬碟就白白被我們吃了。這真的很不好,人家也不能幹。

所以就出了UTF8這種變長的編碼,就說是有的編碼是一位元組的,那好,這種編碼還是和他相容,然後其它的一些就用2,3,4位元組表示。

最後形成一個規律就是,一共有一到四位元組四種變長的編碼。

一位元組:0*******

兩位元組:110*****,10******

三位元組:1110****,10******,10******

四位元組:11110***,10******,10******,10******

就是這四種情況。相信你已經知道我們怎麼來判斷一個字是幾字節的了。規則就是:

如果是以0開頭的,那麼他就是一個1位元組編碼,取到他一位元組的資料去一位元組表中找就OK了。

如果是以110開頭的,那麼他就是一個2位元組編碼,取到他兩位元組的資料去兩位元組表中找就OK了,而且他的第二個位元組一定要是10開頭,不然就是亂碼了。

後面類推。

核心之處就是把0,10,110,1110,11110這五種位元的情況用在不同的位置而區分開各種編碼。這在TCP/IP網路協議中也有很多類似的用法。比如幾類IP地址的劃分。下面這個圖就是說這個:

還有一點要說明,就是一個UTF8格式的檔案,他要表示他的身份,以讓人用UTF8的讀法來讀他。

可能我們仔細的看一下這個檔案的內容,看一下他的編碼方式,和我們上面一不一樣,就知道他是不是UTF8了,不過還有一種保險一點的方法,就是在檔案的最開頭加上三個位元組的資訊,這三個位元組比較少見,所以一見到他們三個開頭,我們就知道是UTF8的了。

不過這不是必須的,可能我們沒有這三個位元組也可以。所以這中間就有一些麻煩。

比如UltraEdit這個強大的工具,我們可以用他檢視16進位制,你可以試試建立一個詞本,然後用16進位制模式開啟,記一下他開著的幾個位元組,然後儲存為UTF8,再看一下前幾個位元組,就會發現多了三個位元組。這就是剛才說的頭,他的學名叫BOM。

這三個位元組分別是:EF BB BF