天天看點

談談字元編碼字元集

什麼是字元集?

集,即集合的意思,字元集字面上的意思就是字元的集合,本意也是如此,字元集就是某類字元的集合,比如說:對于英語國家使用的二十六個字元,我們将其命名為一個字元集,即ASCII。還有歐洲國家使用的ISO8859,以及以表現多國語言為目标的Unicode。

什麼是字元編碼?

對于某一個字元集中的字元,人們對于每個字元給予一個數字編碼進行表式,但是衆口難調,字元編碼也難調,同一個字元集,不同的人也會用不同的方式去表達,這樣同一個字元集就有了多種編碼,如:utf-8,utf-16等都是對于unicode字元集的不同編碼方式。

為什麼有字元集和字元編碼這些東西?

因為計算機最開始是為了計算而設計的,理所當然的,計算機表達數字會更為友善一些,後來純粹的數 字計算越來越少,計算機需要處理人類的文字語言,于是我們需要一種方法将數字映射為人類的文字,這種映射關系就是對字元進行編碼。

起初,計算機是在英語國家發展起來的,這些國家的語言是由26個英文字母組合而成,我們給這二十六個英文字元的大小寫以及其他一些特殊字元一共是128個字元,分别映射到一個數字上面,于是我們可以用7位二進制來表示這每一個字元,這種方式我們稱之為ASCII碼,而對于通信機關字來說,每個字包含八個位元組,于是我們還多了一位用于錯誤碼檢測。

談談字元編碼字元集

對于非英語國家而言,語言可能就複雜了,就咱們中國的漢字來說,常用的就有好幾千個,8位二進制遠遠無法表達這些資訊,而且每個國家都定義了自己的一套編碼規則,結果世界上充滿了各種文字編碼,如果軟體隻限于一國一語言來說沒有大礙,但是如果需要支援多語言的時候就會出問題了。為了解決這個問題,在蘋果,微軟等公司主導下定義了一種意圖涵蓋世界上所有文字的編碼體系Unicode。起初的Unicode設計是打算利用兩個位元組長度即16位二進制(65535個字元)來涵蓋所有的字元,當時可能這些就夠了,但是随着語言的發展,越來越多的字元被加進來了,不能囊括在16個字元的範圍内,最新的unicode規範是unicode6.3,涵蓋了超過十萬個字元的巨大集合。

我們平常說的utf-8, utf-16,utf-32就是對于unicode這個字元集的編碼方式。

utf-8是采用一種變長的編碼方式,與已有的ASCII字元集編碼相容。對于前八位字元其編碼方式與ASCII編碼一樣,是以即使是将ASCII當做utf-8編碼也不會有問題。

下圖是utf-8的位元組組合

1.除了第一個位元組是0開頭,其他的位元組都是10開頭

2.可以根據第一個位元組知知道之後還有幾個位元組

談談字元編碼字元集

utf16采用定長的16位來表示一個字元,如此隻能表示65535個字元,對于超過16為字長的字元,用兩個16位碼的組合來表示。

utf-32就是采用定長32位來表示一個字元,缺點是浪費記憶體空間。

我們的程式中為什麼會有亂碼出現呢?

如果世界上隻有unicode這麼一個大集合,且值規定了utf-8這麼一種編碼方式,那麼世界太平,計算機中的所有存儲都按這種方式去編碼以及解碼資訊,那麼也就沒有所謂的亂碼,當使用了utf-8方式去編碼,而采用utf-16方式去解碼的時候,亂碼就發生了。是以對于亂碼我們要搞清楚輸入資訊是用的什麼編碼方式,然後用對應的方式去解碼。

繼續閱讀