字元編碼的發展

2022-09-09 15:48:25 字數 2667 閱讀 3146

1、字元碼的出現

我們都知道,計算機只能處理數字,即0和1,如果要處理文字,就必須先把文字轉換為數字才能處理。最早的計算機在設計時採用8個位元(bit)作為乙個位元組(byte),所以,乙個位元組能表示的最大的整數就是255(二進位制11111111=十進位制255),如果要表示更大的整數,就必須用更多的位元組。比如兩個位元組可以表示的最大整數是65535,4個位元組可以表示的最大整數是4294967295。

由於計算機是美國人發明的,所以只出現大小寫英文本母、數字和一些符號。因此,最早只有127個字元被編碼到計算機裡,也就是7位2進製數字,最高位(第八位)為0。這個編碼表被稱為ascii編碼,比如大寫字母a的編碼是65,小寫字母z的編碼是122。

3、unicode的由來

ucs-4的0組0面也稱為基本多語言平面(basic multilanguage plain)也就是說ucs-4的高2位元組都為的時候稱為bmp,bmp和ucs-4的轉換也很簡單,在bmp的高位新增兩個位元組的0就稱為ucs-4,將ucs-4的高二位元組都變成0就變成了bmp。

4、utf-8的由來

現在,捋一捋ascii編碼和unicode編碼的區別:ascii編碼是1個位元組,而unicode編碼通常是2個位元組。

字母a用ascii編碼是十進位制的65,二進位制的01000001;

字元0用ascii編碼是十進位制的48,二進位制的00110000,注意字元』0』和整數0是不同的;

漢字中已經超出了ascii編碼的範圍,用unicode編碼是十進位制的20013,二進位制的01001110 00101101。

你可以猜測,如果把ascii編碼的a用unicode編碼,只需要在前面補0就可以,因此,a的unicode編碼是00000000 01000001。

新的問題又出現了:如果統一成unicode編碼,亂碼問題從此消失了。但是,如果你寫的文字基本上全部是英文的話,用unicode編碼比ascii編碼需要多一倍的儲存空間,在儲存和傳輸上就十分不划算。

所以,本著節約的精神,又出現了把unicode編碼轉化為「可變長編碼」的utf-8編碼。utf-8編碼把乙個unicode字元根據不同的數字大小編碼成1-6個位元組,常用的英文本母被編碼成1個位元組,漢字通常是3個位元組,只有很生僻的字元才會被編碼成4-6個位元組。如果你要傳輸的文字包含大量英文本元,用utf-8編碼就能節省空間。

我們還可以發現,utf-8編碼有乙個額外的好處,就是ascii編碼實際上可以被看成是utf-8編碼的一部分,所以,大量只支援ascii編碼的歷史遺留軟體可以在utf-8編碼下繼續工作。

下表總結了編碼規則,字母x表示可用編碼的位。

unicode符號範圍 | utf-8編碼方式

(十六進製制) | (二進位制)

——————–+———————————————

0000 0000-0000 007f | 0******x

0000 0080-0000 07ff | 110***xx 10******

0000 0800-0000 ffff | 1110***x 10****** 10******

0001 0000-0010 ffff | 11110*** 10****** 10****** 10******

下面,以漢字「嚴」為例,演示如何實現utf-8編碼。

已知「嚴」的unicode是4e25(100111000100101),根據上表,可以發現4e25處在第三行的範圍內(0000 0800-0000 ffff),因此「嚴」的utf-8編碼需要三個位元組,即格式是「1110***x 10****** 10******」。然後,從「嚴」的最後乙個二進位制位開始,依次從後向前填入格式中的x,多出的位補0。這樣就得到了,「嚴」的utf-8編碼是「11100100 10111000 10100101」,轉換成十六進製制就是e4b8a5。

5、gbk

當計算機傳出到中國之後,國家也面臨字元編碼相關的工作,所以當時就推動制定了一套雙位元組編碼編碼規範,他收錄了常見的6000多個中文、東亞文字以及歐美文字,所有的字母採用兩個位元組進行編碼,稱為gbk,由於微軟等公司的支援,所以gbk在中國很流行,以至於現在的很多小企業還是採用gbk編碼。

6、實現方式

unicode的實現方式不同於編碼方式。乙個字元的unicode編碼是確定的。但是在實際傳輸過程中,由於不同系統平台的設計不一定一致,以及出於節省空間的目的,對unicode編碼的實現方式有所不同。

unicode的實現方式也稱為unicode轉換格式(unicode transformation format,簡稱為utf),目前主流的實現方式有utf-16和utf-8。隨著unicode通用字符集的擴充,進而出現了utf-32,但是由於占用空間太大,目前很少有系統選擇使用utf-32作為系統編碼。

7、字元亂碼

當計算機只是在本地(使用一種字元編碼的範圍內的地區)使用和傳播的時候不會出現什麼問題,但是當不用的區域需要進行資訊交換的時候就會出現問題,比如中國和歐洲進行字元交換,中國使用gbk編碼,歐洲使用eascii編碼。那麼會出現這樣一種情況,乙個中國的漢字,被顯示為連個奇怪的西歐字元,看到上面的歷史,應該明白原因了吧。

8、ucs系列

隨著資訊交流越來越頻繁。字元亂碼的問題也就越來越突出,統一編碼的需求也就越來越強烈。所以ios組織就提出了乙個統一的編碼方案。大致的規則如下:

字元編碼的發展歷程

階段1 計算機只認識數字,我們在計算機裡一切資料都是以數字來表示,因為英文符號有限 所以在規定使用的位元組的最高位是0,每乙個位元組都是以0 127之間的數字來表示,比如a對應65,a對應97。這就是美國標準資訊交換碼 ascll。階段2 隨著計算機在全球的普及,很多國家和地區都把自己的字元引入了計...

字元編碼 字元編碼的奧秘

字元編碼相信是每個程式設計師的噩夢,只要是有中文的地方,總是會遇到各種編碼的問題,並且這種問題還非常難纏,尤其在linux上,因為上面很多軟體都是針對 英語國家開發的,是不會考慮其他語種編碼問題。在遇到編碼的無數大坑之後,我決定仔細研究下編碼問題,因為這就像一道坎一直橫在你面前,每次到這裡你都會 跌...

02 字元編碼發展歷史 檔案操作

1.程式執行與三大核心硬體的關係 程式最先都是存放於硬碟之中的 程式執行時是先把程式從硬碟中載入到記憶體中去 然後cpu從記憶體中讀取資料和指令執行2.程式產生的資料最初都是存放於記憶體中 3.python程式執行的三個步驟 如 python3 d a.py 先啟動python直譯器 直譯器將檔案a...