多年來閒麻煩,只記錄筆記,未曾編寫BLOG,本文爲原創,如需轉載請標明出處html
廢話不說,直奔主題java
計算機只接受 「高」、「低」電壓,因此使用二進制 1 和 0 分別表明高低電壓
ascii 將 「字符」和「符號」轉爲二進制,在經過二進制轉爲電壓讓計算機識別
0-127 是 7 位ASCII 碼的範圍,是國際標準 0111 1111
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 JAVA 中 將字符串轉換爲字節爲例
byte[] str2byte = new String("中漢").getBytes("utf-8");
for (byte b : str2byte) {
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
做用:
主要用於將二進制數據轉換成可見字符
由來:
早期 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