必知必會話題之:字元編碼精簡匯總

一、編碼的產生原因及發展原因

1.最初電腦源於美國,鍵盤上大家常見的這些字元用一個位元組的7個bit來表示就滿足了(最高位是符號位不動),這就是ascii碼 

2.隨著電腦的普及發展,各國也需要將自己的文字字元加入進來,發現原有的ascii碼已經不夠用了,剛開始沒想好,覺得用起來一個位元組的符號bit位到了2^8的情況,

發現各國交流起來是有問題的,而且還有很多國家字元超級多………..

3.既然一個位元組滿足不了,我們就多個位元組,於是美帝提出用一種標準方案,來展示世界上所有語言中的所有字元,出於這個目的,Unicode誕生了。

二、關於Unicode

1.Unicode  相當於是一本字典,記錄著世界上所有字元對應的一個數字。 Unicode 給所有的字元指定了一個數字用來表示該字元。這表大家自行搜索下.

2.Unicode  它的想法很簡單,就是為每個字元規定一個用來表示該字元的數字,僅此而已。沒有說明這個數字在記憶體二進位中如何來存儲. 

這就引申出兩個問題:

a.Unicode的編碼方案會有多種.

b.數字的二進位在記憶體中高低端放置問題. BE LE

三、Unicode的各種編碼方案的由來及優缺點

UTF-32

為了滿足最初最原始的慾望,簡單粗暴地將各國的字元放在裡面,定長編碼,字元統一使用 4 個位元組

優點:編碼簡單快速

缺點:浪費存儲空間,不適合網路傳輸

UTF-16

UTF-32既然太粗暴浪費空間,我們就做一個簡單的劃分:UTF-16 的編碼長度要麼是 2 個位元組(U+0000 到 U+FFFF),要麼是 4 個位元組(U+010000 到 U+10FFFF)

具體實現細節,請自行查閱.

優點:一定程度縮減UTF-32的空間佔用問題

確定:不利於空間的合理存儲

UTF-8 

UTF-8 使用變長位元組進行字元編碼, 使用的位元組數可變,這個變化是根據 Unicode 編號的大小有關,使用的位元組個數從 1 到 4 個不等。劃分方式參考下圖

是最流行的編碼的方式,原因很簡單:在電腦速度突飛猛進的今天,編碼解碼速度基本上不是問題,所以存儲空間是人們更加關心的問題.

 

UTF-8 的編碼規則:

a. ASCII 碼中的字元均用一個位元組進行表示.

b.n位元組的符號(4>=n>2),第一個位元組的前 n 位都設為 1,第 n+1 位設為 0,後面位元組的前兩位一律設為 10,剩下的沒有提及的二進位位,全部為這個符號的 Unicode 碼 。

 

舉個例子:比如說一個字元的 Unicode 編碼是 2049,那麼就需要三個位元組(n = 3)。

這三個位元組的情況如下

第一個位元組 第二個位元組 第三個位元組
1110XXXX 10XXXXXX 10XXXXXX

 

根據規則,第一個位元組的前 3 位都設為 1,第 4 位設為 0,則第一個位元組為:110X XXXX,後面兩個位元組的前兩位一律設為 10,格式如:10XX XXXX。

 

接下來的問題:這些X中需要填寫什麼東西呢?答案是編碼的二進位,即將unicode的二進位從右到左依次放入對應的xxx位置中.

 2049的二進位是1000 0000 0001那麼填進去,這三個位元組的情況就變成了,最後剩餘的xxxx用0補上即可

第一個位元組 第二個位元組 第三個位元組
1110XXXX 10100000 10000001

 四、大端小端

1.概述:為什麼會有大端小端的概念

電腦的記憶體是以位元組為單位的,

而CPU的暫存器表示的數據是大於一個位元組的,

那麼就存在了一個問題,例如0x1234這樣的數據如何放到記憶體中,供CPU暫存器進行讀取使用呢?

0x12是高位,0x34是地位,這些數據放在記憶體的高低,就產生了高低位的說法.

記憶體地址 記憶體中的數據
地址a+1 0x34
地址a 0x12

(大端存儲:高位在低地址記憶體)

記憶體地址 記憶體中的數據
地址a+1 0x12
地址a 0x34

(大端存儲:高位在高地址記憶體)

各類CPU廠商大小端方式有差異, 通訊協議是大端的。

 

2.常見的位元組序

常見CPU位元組序

Big Endian : PowerPC、IBM、Sun
Little Endian : x86、DEC
ARM既可以工作在大端模式,也可以工作在小端模式。

常見文件位元組序

Adobe PS – Big Endian
BMP – Little Endian
DXF(AutoCAD) – Variable
GIF – Little Endian
JPEG – Big Endian
MacPaint – Big Endian
RTF – Little Endian

PS:有人問了解這些有什麼用,其實很簡單因為你是做IT的,有些東西是基本功,且必知必會.