編碼與解碼
編碼方式:計算機中所有的信息都采用0
,1
這樣的二進制位來表示,那么肯定存在特定的映射規則(例如:0010 0011
-> #
) 我們將這種一一對應的規則稱為編碼(方式)。 常見的編碼方式有 ASCII、UTF-8、GBK等
編碼:我們希望將 Hi!
這句話保存在磁盤上,由於計算機只能存儲 0
和1
因此我們可以將 Hi!
按照某種編碼方式(ASCII)轉化為 01001000 01101001 00100001
來存儲。從字符串到 二進制的過程叫 編碼。
解碼:當我們需要將磁盤上的一句話顯示在屏幕上時,先從磁盤讀取二進制數據 ——01001000 01101001 00100001
, 然后按照我們之前使用的 ASCII 編碼方式(對應關系集合)將二進制轉為 Hi!
。從二進制到字符串的過程叫 解碼。
總結:編碼和解碼是自然語言符號
和二進制符號
相互轉化的過程,要實現一一對應的轉換,就需要依賴某種對應規則,而這種對應規則就是我們所說的編碼方式。
ASCII 編碼
機器存儲數據按照字節來存儲,一個字節 8位,每一位有0
和1
兩種狀態。因此一個字節理論上可以表示 2^8 = 256
個不同的狀態,每個狀態對應一個字符就是256
個字符。
標准的 ASCII 編碼標准 使用最低7位
(后7位)表示字符(最高位為0
)共 128
個字符。
- 0~31、127 為不可見字符(共
33
個) - 32~126(共95個)是字符(32是空格),其中48~57為0到9十個阿拉伯數字。
- 65~90為26個大寫英文字母,97~122號為26個小寫英文字母,其余為一些標點符號、運算符號等
ASCII 對照表:
其他編碼
英語中128個符號編碼就夠了,但是隨着計算機的發展,網絡鏈接了不同語言的地區和國家,即使將ASCII碼中保留的最高位用掉也不夠表示全世界各種語言的自然符號。
因此各個國家和地區都推出了自己地區專用的編碼方式,例如中國的GBK
、GB18030
、GB2312
等,但是使用地區編碼的字符無法在其他地區使用。由於編碼的不一致,信息交換的成本過高,例如日本的游戲中國用戶無法使用,中國發送的電子郵件法國的朋友無法閱讀... ...
高昂的信息交換成本使得這樣一種編碼方式的誕生成為必然。即這種編碼將世界上所有的符號都納入其中,每一個符號都給予一個獨一無二的編碼,它將徹底的解決亂碼問題。它就是 Unicode
,就像它的名字都表示的,這是一種所有符號的通用編碼。
國標 GBK、GB18030、GB2312
國標編碼,是一種兼容ASCII編碼
的漢字雙字節編碼字符集(由於ASCII碼
高位為0
因此,國標碼兼容ASCII碼
部分為單字節)常用的國標碼中 GB18030
字符集更加豐富。
Unicode
注意:
Unicode
只是一個字符集,它只規定了自然符號和二進制碼的映射關系,但沒有規定這個二進制碼的存儲策略。
由於 Unicode字符集
過於龐大,在使用中會占用2~4倍的存儲空間,並且很多字符存儲中會出現大量冗余字節(設每個字符占4字節,英文僅需要一個字節表示,那所有的 ASCII 字符前三個字節全為 0
,這是無法接受的)
純文本文件采用ASCII碼
表示為 1M
。若內容不變改為Unicode編碼
表示則會變成4M
,直接擴大了4倍。無論從何種角度來看這都是無法接受的。
UTF-8
注意: 它
不是
Unicode字符集的子集
,而是Unicode
的實現方式之一。
特點
- 它是一種變長的編碼方式。
- 它使用1~4個字節表示一個符號,根據不同的符號而變化字節長度。
- 它兼容 ASCII編碼
編碼規則
1 與GBK的策略一致,當高位為0時,認為是ASCII字符,反之為其他字符。
2 以首個字節的高位的第一個0
前的1個數標記該字符所占字節數,其后為 unicode
碼值。