編程過程中經常會遇到各類字符的編碼方式,經常會混淆,在此總結下常用的編碼方式以及其原理。
Ascii:
因為對於計算機來說只能識別0、1這兩種字符(0表示低電平,1表示高電平),所有的數據都是通過二進制來表示,對於其他的比如說3、4、s、z、#等字符用二進制表示就需要一個約定的規范,這就是ascii的由來。
Ascii碼表是用1個字節來表示128種字符(一個字節8位,可以組成256種字符,首位默認為0,所以ASCII最多就128個字符,當首位為1的時候我們后面再討論),其中0-31和127表示控制字符,他們是不可見字符。
32-126是可見字符,48-57表示0-9,65-90為26個大寫英文字母,97-122是26個小寫英文字母。
GBK:
現在英文和數字都有了,但是我們中國漢字怎么表示呢?此時GBK應運而生,上面我們得知ASCII首位為0,假如把它改成1,就表示中文。GBK由2個字節來表示,第一個字節的最高位是0則表示字母和數字,假如是1則表示中文。
Unicode:
Unicode則是收錄了世界上所有的語言, 但是在運用過程種會出現很多問題,比如一個3個字節的字符,如何區分他是1個unicode還是3個asicii,還有假如使用unicode,英文字母高位都會設置成0,這就造成了很大的浪費。因此UTF-8、UTF-16、UTF-32就出現來解決這些問題,主要講當前互聯網上常用的UTF-8
UTF-8:
UTF-8的規則很簡單就兩條:
1、 對於單字節的字符,最高位為0,其實跟ascii表示一致
2、 對於n個字節的字符,第一個字節的最高位為n個1,第n+1設為0,后面每個字節的前兩位都為10,剩下的用字符對應的unicode來表示,如下圖
Unicode符號范圍 | UTF-8編碼方式
(十六進制) | (二進制)
--------------------+---------------------------------------------
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
BCD:
BCD編碼主要用於數字0-9的壓縮,因為0-9二進制表示為0000 0000到0000 1001,它們的前4位都是0,把他們合並就生成一個新的字符。
比如2個字符’1’,’9’,他們對應的Ascii為0x31和0x39,因此表示形式則為2個字節0x31 0x39
假如用BCD格式來表示則將其數字對應的二進制前4位去掉,然后合並,即將00000001和00001001前4位去掉得到0001 1001,得到新的1個字節0x19,這樣看起來就跟十進制一樣,這就是BCD壓縮碼的原理。
Base64編碼:
Base64編碼的作用是將ascii里面的不可見字符變成可見字符來傳輸。Base64編碼的最小使用單元是4個字節,每個字節使用6位,假如不足6的整數倍,則后面補0,剩下的字符補=,因為計算機存儲字節是8位,所以計算字符值時在前面補2個0。
可能說的有些繞,看下一張圖就了解了
(借用網上的一張圖片 http://www.cnblogs.com/caoyc/p/5794720.html)
以A為例補位之后第一個字節為010000,前面補0得到00010000,對應10進制為16,對照字符表得到Q,第二個字節一樣,也是Q,然后base64編碼最小是4個字節,后面兩個字節補=,最終得到QQ==

下面是一個Base64字符集,它包含大寫字母、小寫字母和數字,以及“+”和“/”符號。

