1. 程式人生 > >詳細講解 ascii 、byte 以及 UTF-8、base64 的轉碼規則

詳細講解 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 10xxxxxx0x6C49 是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位元組 0xxxxxxx2位元組 110xxxxx 10xxxxxx3位元組 1110xxxx 10xxxxxx 10xxxxxx4位元組 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx5位元組 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx6位元組 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