天天看點

編碼表了解

要了解檔案IO操作,我認為要先從編碼來了解。計算機中所有檔案都是以二進制形式存儲的,計算機底層隻認識高低電位1和0。 8位(bit)為1位元組(byte),1024位元組為1kb。反正以前學電路數電模電,都是0101,大概都是一個意思吧。

曾見過一些錯誤的說法表示,将檔案轉換為二進制存儲以達到節約空間的目的,至今也不能了解這句話的依據何在,檔案本身就是二進制還轉什麼二進制,即使根據編碼表,将文本轉換成可見的二進制數字再進行存儲,那也是大大增加了存儲中間,比如将1 按照ASCII編碼成二進制,那也是00000001,把它以ASCII編碼方式存入文本中也是增加了8倍空間。

也見過有人問漢字占幾個字元,占幾個字元是由如何編碼決定的。如果我定義一個編碼表,并且讀取和存儲文檔都按照我的編碼表實作,我可以把00000001定義為博,00000002定義為客。那這兩個漢字就占一個位元組嘛。按照人家unicode規範就是占2個位元組,utf-8就是占3位元組。

純英文,英文符号以及數字等使用128個碼就足矣了,使用7位可以表示0-127, 為了湊足8位,是以在首部補0,這就是ASCII碼。是以我們看到:

a字母  二進制0110 0001  十進制97

A字母  二進制0100 0001  十進制65

因為ASCII不足以表示我們這麼多漢字字元和其他國家的字元。是以需要更加健全的字元集。  對我們平時比較重要的應當屬于GBK編碼,Unicode字元集和utf-8編碼規則。

unicode和utf-8的關系 實際上就是 目前準備好了一個unicode字元集,而utf-8是該集合字元的一種編碼規則/實作方式,給每一個字元都規定好唯一編号。

我們在C#或者Java寫字元串的時候,需要先轉換String的bytes[]   曾經很不了解 位元組數組是啥?裡面的數字代表什麼? 其實裡面的數字就是給我們展現 底層所存儲的二進制值轉換為10進制的數字而已。

相對于unicode,utf-8的優點在于其漢字一般在3個位元組,而ASCII中的英文和數字還是占一個位元組,從空間上來說是合理的。