多年來閒麻煩,只記錄筆記,不曾編寫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