詳細講解 ascii 、byte 以及 UTF-8、base64 的轉碼規則

多年來閒麻煩,只記錄筆記,不曾編寫BLOG,本文爲原創,如需轉載請標明出處

廢話不說,直奔主題

  • ascii  
 
計算機只接受 “高”、“低”電壓,所以使用二進制  1  和  0 分別代表高低電壓
ascii  將 “字符”和“符號”轉爲二進制,在通過二進制轉爲電壓讓計算機識別
 
0-127 是 7 位ASCII 碼的範圍,是國際標準  0111 1111
 
  • byte 字節
 
1 byte = 8 bit     就是8位二進制數    在不同語言中,字節範圍不應,這主要取決於最高位是不是符號位
 
ascii  就是用一個字節,8位二進制表示一個字符或者符號
 
如 小寫字母 a 的 ascii 編碼是97,不同進製表示如下
 
二進制:01100001   (高四位 0110 低四位  0001)  
十進制:26 + 25 + 20 = 64 + 32 + 1 = 97
 
瞭解了ASCII,再來看看其他編碼和byte的關係
 
gb2312     兩字節     
utf-8          一個 "英文" 字符一字節,一個 "中文" 字符三字節
unicode     所有字符等於 "兩個字節"
 
  • UTF-8
 
以 UTF-8 JAVA 中 將字符串轉換爲字節爲例
 
//字符串和byte轉換樣本
byte[] str2byte = new String("中漢").getBytes("utf-8");
for (byte b : str2byte) {
     System.out.println(b);
}
byte[] byte2str = { -28, -72, -83, -27, -101, -67 };
String str = new String(byte2str, "utf-8");
System.out.println(str);
 
解釋:
 
比如 “漢” 這個字要在網絡上傳輸,最終是要使用二進制表示電壓
 
unicode 編碼表中 “漢”字的編碼是0x6C49,
轉成UTF-8格式,對照映射表, 0x6C49在0x0800-0xFFFF之間, UTF-8使用用3字節模板了:1110xxxx 10xxxxxx 10xxxxxx
0x6C49 是16進製表示, 6C49  寫成二進制是:0110 1100 0100 1001
用這個比特流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89
 
在 java 中,首先要把漢字轉成字節,計算出來的 是 -26,-79,-119,我們發現和E6 B1 89 不同
那麼是如何換算呢
E6 => 1110 0110   因爲JAVA中 byte 是 -128 ~ 127,高位是符號位
計算方式爲    採用補碼計算  取反後+1   去掉符號位,0001 1001 + 1 = 16+8+1 + 1 = 26
高位1 位負數, 所以 E6 對應 -26, 在通過字節傳輸給網絡流,轉成二進制
 
那麼使用UTF-8 將一串中英文轉成二進制,計算機如何接收呢
 
這個就是UTF-8規則編碼,計算機指定了UTF8編碼接收二進制並進行轉移,當發現字節以0開頭,表示這是一個標準ascii字符,直接轉義 ,當發現1110開頭,就說明接下來的三個字節表示一個漢字,則取3個字節去掉模板後轉義,UTF8編碼模板如下
 
 
1字節 0xxxxxxx
2字節 110xxxxx 10xxxxxx
3字節 1110xxxx 10xxxxxx 10xxxxxx
4字節 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
5字節 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
6字節 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
 
  • base64
 
作用:
  主要用於將二進制數據轉換成可見字符
 
由來:
  早期 MIME 協議 Multipurpose Internet Mail Extensions 只能傳輸ASCII字符,這樣非英文字符和圖片就無法在郵件中發送
  (ASCII包含的字符少,GBK等包含的中文在ascii表示不了,所以有UTF)
 
  BASE64就是將這些二進制數據轉換成64個定義好的ASCII字符,一方面可以傳輸,一方面可以也可見,比如XML里加入二進制圖片持久化,就是用 BASE64 進行存儲
  BASE64  最小使用單元是3字節,24bit   轉換後將24bit且成4塊,然後每塊是6bit,因爲計算機存儲字節是8bit,所以在高位補兩個0
  
  e.g.    100101  轉換後   00100101
  這樣就得到了4個ascii  字符,不過長度也隨之增加
 
  另外,URL裏不支持 /  +這類字符,所以一般使用  safe  url base 64編碼,由於BASE64是3*8 = 4*6 的遊戲,
 
  注意:當轉換成6位時,需要查BASE64編碼表,而不是查ASCII表,另外,當轉化不是3的倍數時,看下圖
 
  (借用網上的一張圖片 http://www.cnblogs.com/caoyc/p/5794720.html)
  

 

  這裏再舉例小寫 a 

  01100001   轉換後是   011000   010000  補4個0變成2字節,得到YQ,BASE64要求4個字節  補兩個 ==
  得到  YQ==
 
文章參考:http://www.cnblogs.com/caoyc/p/5794720.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章