必知必會話題之:字元編碼精簡匯總
一、編碼的產生原因及發展原因
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的,有些東西是基本功,且必知必會.