編碼方式詳解及由來

2021-07-03 16:48:43 字數 3068 閱讀 9803

控制碼:0-32

ascii :33-127

ascii 擴充套件字符集:128-255

gb2312:兩個127後的字元連線起來就是漢字

gbk:高位元組127後,低位元組沒有限制

gb18030:在gbk基礎上有擴充套件增加少數民族的字

unicode:前127不變,之後的重新編制。都是採用的兩個位元組表示

utf8/16:每次8/16個位傳輸資料

由來:有一群人,他們決定用8個可以開合的電晶體來組合成不同的狀態,以表示世界上的萬物。他們看到8個開關狀態是好的,於是他們把這稱為「位元組」

8位的位元組一共可以組合出256(2的8次方)種不同的狀態

其中把從0開始的32種狀態分別規定了特殊的用途,一但終端,印表機上約定好的這些位元組被傳過來時,就要做一些約定的動作,於是把這些0x20以下的位元組狀態稱為"控制碼"

他們又把所有空格,標點符號,數字,大小寫字母分別用連續的位元組狀態表示,一直編到了第127號,這樣計算機就可以用不同的位元組來儲存英文的文字了,大家看感覺都很好,於是大家都把這個方案叫做ansi的「ascii」編碼(american standard information interchange,美國資訊互換標準**)

後來,很多國家都是用計算機,發現他們的字母在ascii裡面有許多都是沒有的,為了可以在計算機中儲存它們的文字,決定採用127號之後的空位來表示這些新的字母,符號,還加入了很多畫**時需要的橫線,豎線,交叉等形狀,一直把序號編到了最後乙個狀態255.從128到255這一頁的字符集被稱「擴充套件字符集」。

等到中國人們得到計算機時,已經沒有可以利用的位元組狀態來表示漢字,況且有6000多個常用漢字需要儲存,但這並難不倒智慧型的中國人民,我們毫不客氣的把那些127號之後的起義符號們直接取消掉,規定:乙個小於127的字元的意義和原來相同,但兩個列印127的字元連線在一起就表示乙個漢字,前面的乙個位元組(高位元組)從0xa1用到0xf7,後面的乙個位元組(低位元組)從0xa1到0xfe,這樣我們就可以組出大約7000多個簡體漢字,在這些編碼裡,我們還把有的數字,標點,字母都統統重新編入了兩個位元組長的編碼,這就是常說的「全形」字元,而原來在127號以下的那些叫「半形」字元了

中國人民看到這樣很不錯,於是就把這種漢字方案叫做」gb2312「。gb2312是對ascii的中文擴充套件

但是中國的漢字太多了,我們很快發現許多人的人名沒有辦法在這裡打出來,特別是某些很會麻煩別人的國家領導人。於是我們不得不繼續把gb2312沒有用到的編碼找出來老實不客氣的用上。

後來還是不夠用,於是乾脆不要求低位元組一定是127號之後的內碼,只要第乙個位元組是大於127就固定表示這是漢字的開始,不管後面跟著的是不是擴充套件字元裡面的內容,結果擴充套件之後的編碼方案被稱為gbk標準,gbk包括了gb2312的所有內容,同時又增加了近20000個新的漢字(包括繁體字)和符號

後來少數民族也要用電腦,於是我們再擴充套件,又增加了幾千個新的少數民族的字,gbk擴充套件成了gb18030。從此以後,中華民族的文化就可以在計算機時代中傳承了

中國程式設計師看到這一系列漢字編碼的標準是好的,於是通稱他們叫「dbcs」(double byte charecter set 雙位元組字符集)。在dbcs系列標準裡,最大的特點是兩個位元組長的漢字字元和乙個位元組長的英文本元並存於同一套程式設計方案裡,因此他們寫的程式為了支援中文處理,必須要注意字串裡的每乙個位元組的值,如果這個值是大於127的,納悶就認為乙個雙位元組字符集裡的字元出現了,那時候凡是收到支援,會程式設計的計算機僧侶,們都要每天念下面這個咒語數百遍:

「乙個漢字算兩個英文本元!乙個漢字算兩個英文本元。。。「

當時不同的地方都有自己一套的dbcs編碼方案,要想在電腦上顯示漢字,必須安裝上乙個」漢字系統「專門用來處理漢字的顯示,輸入的問題,裝錯了字元系統,顯示就會亂了套,這怎麼辦?

正在這時,大天使加百列及時提出了乙個叫iso(國際標準化組織)的國際組織決定著手解決這個問題。他們採用的方法很簡單:廢除了所有地區性編碼方案,重新搞了乙個包括了地球上所有文化,所有字元和符號的編碼!他們打算叫他」universal multiple-octetcoded character set「,簡稱ucs,俗稱」unicode「

unicode 開始制定時,計算機的儲存器容量極大地發展了,空間再也不是問題了。於是iso就直接規定必須用兩個字元,也就是16位來統一表示所有的字元,對於ascii裡面的那些」半形「字元,unicode其編碼不變,只是將其長度由原來的8位擴充套件為16位,其他文化和語言的字元則全部重新統一編碼。由於」半形「英文符號只需要用到低8位,所以其高8位永遠是0,因此這種大氣方案在儲存英文文字時會多浪費一倍空間。

這時候,從舊社會出來的程式設計師發現乙個奇怪的現象:他們的strlen函式靠不住了,乙個漢字不再是相當於兩個字元了,而是乙個。從unicode開始,無論半形還是全形,他們都是統一的乙個字元,乙個字元就是兩個位元組,乙個漢字算兩個英文本元的時代很快過去了。

但是在uncode制定的時候沒有考慮與任何一種現有的編碼方案保持相容,這使得gbk與uncode在漢字的內碼編排上完全是不一樣的,沒有乙個簡單的算術方法可以把文字內容從uncode編碼和另外一種編碼進行轉換,這種轉換必須通過查表來進行;兩個位元組表示為乙個字元,他總共可以組合出65535不同的字元,如果還不夠,iso已經準備了ucs-4方案,簡單來說就是四個位元組來表示乙個字元。

unicode來到時,一起到來的還有計算機網路的興起,unicode如何在網路上傳輸也是乙個必須考慮的問題,於是面向傳輸的眾多utf(ucs transfer format)標準出現了,顧名思義,utf8就是每次8個位傳輸資料,而utf16就是每次16個位,只不過為了傳輸時的可靠性,從unicode到utf時並不是直接的對應,而是要經過一些演算法和規則來轉換

在網路傳輸中有個很重要的問題就是高低位傳輸,一把是高位顯傳送,為了核實高低位是否一致,採用了一種很簡單的方法,就是在文2向對方傳送乙個標誌符;如果之後的文字是高位在前,就傳送」feff「,反之就傳送」fffe「。

移動之所以打不過移動的原因,是在windows的記事本裡新建個檔案,輸入」聯通「兩字之後,儲存,關閉,再次開啟,就會發現出現亂碼了!

其實這是因為gb2312編碼方式與utf8編碼產生了編碼衝撞的原因,聯通的內碼是 c1 1100 0001 aa 1010 1010  cd 11001101  a8 1010 1000  和第一二個和第三四個位元組的起始都是」110「和10正好與utf8規則裡面的兩位元組模板是一致的  他們在0080-07ff之間用兩個位元組模板是110××××× 10××××××

Base64由來,與編碼方式

base64到底是乙個什麼東西?它有什麼用?它是怎麼來的?世界上幾乎所有的東西,都不會無中生有。base64也一樣。我們知道在計算機中任何資料都是按ascii碼儲存的,而ascii碼的128 255之間的值是不可見字元。而在網路上交換資料時,比如說從a地傳到b地,往往要經過多個路由裝置,由於不同的裝...

編碼方式及轉換

ascii碼 用八位二進位制表示乙個英文 乙個位元組 unicode 中英文均用32位二進位制表示 四個位元組 utf 8 英 8位 乙個位元組 中 24位 三個位元組 gbk 英 8位 乙個位元組 中 16位 兩個位元組 1 各個編碼之間的二進位制不能相互識別 2 檔案的儲存,傳輸不能是unico...

Linux的由來及組成

linux系統的由來 linux系統是基於unix的基礎誕生,linux 是一套 unix like 的作業系統,是 unix 的一種,它控制整個系統基本服務的核心程式,linux這個名稱便是以linus s minix來命名,他選擇了運用大眾公有版權 這個版權任何人都可以使用,換句話說,linux...