十分鐘搞清字符集和字元編碼

2021-06-29 07:17:00 字數 1513 閱讀 8320

在介紹字符集之前,我們先了解下為什麼要有字符集。我們在計算機螢幕上看到的是實體化的文字,而在計算機儲存介質中存放的實際是二進位制的位元流。那麼在這兩者之間的轉換規則就需要乙個統一的標準,否則把我們的u盤插到老闆的電腦上,文件就亂碼了;小夥伴qq上傳過來的檔案,在我們本地開啟又亂碼了。於是為了實現轉換標準,各種字符集標準就出現了。簡單的說字符集就規定了某個文字對應的二進位制數字存放方式(編碼)和某串二進位制數值代表了哪個文字(解碼)的轉換關係。

那麼為什麼會有那麼多字符集標準呢?這個問題實際非常容易回答。問問自己為什麼我們的插頭拿到英國就不能用了呢?為什麼顯示器同時有dvi,vga,hdmi,dp這麼多介面呢?很多規範和標準在最初制定時並不會意識到這將會是以後全球普適的準則,或者處於組織本身利益就想從本質上區別於現有標準。於是,就產生了那麼多具有相同效果但又不相互相容的標準了。

說了那麼多我們來看乙個實際例子,下面就是屌這個字在各種編碼下的十六進製制和二進位制編碼結果,怎麼樣有沒有一種很屌的感覺?

字符集16進製制編碼

對應的二進位制資料

utf-8

0xe5b18c

1110 0101 1011 0001 1000 1100

utf-16

0x5c4c

1011 1000 1001 1000

gbk0x8cc5

1000 1100 1100 0101

字符集只是乙個規則集合的名字,對應到真實生活中,字符集就是對某種語言的稱呼。例如:英語,漢語,日語。對於乙個字符集來說要正確編碼轉碼乙個字元需要三個關鍵元素:字型檔表(character repertoire)、編碼字符集(coded character set)、字元編碼(character encoding form)。其中字型檔表是乙個相當於所有可讀或者可顯示字元的資料庫,字型檔表決定了整個字符集能夠展現表示的所有字元的範圍。編碼字符集,即用乙個編碼值code point來表示乙個字元在字型檔中的位置。字元編碼,將編碼字符集和實際儲存數值之間的轉換關係。一般來說都會直接將code point的值作為編碼後的值直接儲存。例如在ascii中a在表中排第65位,而編碼後a的數值是0100 0001也即十進位制的65的二進位制轉換結果。

看到這裡,可能很多讀者都會有和我當初一樣的疑問:字型檔表和編碼字符集看來是必不可少的,那既然字型檔表中的每乙個字元都有乙個自己的序號,直接把序號作為儲存內容就好了。為什麼還要多此一舉通過字元編碼把序號轉換成另外一種儲存格式呢?

看完上面兩個概念解釋,那麼解釋utf-8和unicode的關係就比較簡單了。unicode就是上文中提到的編碼字符集,而utf-8就是字元編碼,即unicode規則字型檔的一種實現形式。隨著網際網路的發展,對同一字型檔集的要求越來越迫切,unicode標準也就自然而然的出現。它幾乎涵蓋了各個國家語言可能出現的符號和文字,並將為他們編號。詳見:unicode on wikipedia。

unicode的編號從0000開始一直到10ffff共分為16個plane,每個plane中有65536個字元。而utf-8則只實現了第乙個plane,可見utf-8雖然是乙個當今接受度最廣的字符集編碼,但是它並沒有涵蓋整個unicode的字型檔,這也造成了它在某些場景下對於特殊字元的處理困難

十分鐘搞清字符集和字元編碼

在介紹字符集之前,我們先了解下為什麼要有字符集。我們在計算機螢幕上看到的是實體化的文字,而在計算機儲存介質中存放的實際是二進位制的位元流。那麼在這兩者之間的轉換規則就需要乙個統一的標準,否則把我們的u盤插到老闆的電腦上,文件就亂碼了 小夥伴qq上傳過來的檔案,在我們本地開啟又亂碼了。於是為了實現轉換...

課間十分鐘

時間限制 1000 ms 記憶體限制 128 mb 兩人都是數學愛好者,便發明了乙個遊戲。在遊戲開始前,他們先約定乙個正整數n,同時令m 1。遊戲過程中,每個人都可以將m的值擴大2到9中的任意倍數。第乙個使m n的人就是最後的贏家。181818181818和zbt都十分聰明,並且遊戲過程中都使用最佳...

十分鐘的代價

2008年9月15日上午10 00,擁有158年歷史的美國第四大投資銀行 雷曼兄弟公司向法院申請破產保護,訊息轉瞬間通過電視 廣播和網路傳遍地球的各個角落。令人匪夷所思的是,在如此重大的情況下,德國國家發展銀行在十分鐘後,居然按照外匯掉期協議的交易,通過計算機自動付款系統,向雷曼兄弟公司即將凍結的銀...