Java培訓之IO流&網絡編程(一)
更新時間:2017-05-31 來源:黑馬程序員Java培訓學院 瀏覽量:
1、編碼表:|--由來:計算機只能識別二進制數據,早期由來的是電信號,為了方便計算機能識別各個國家的文字,就將各個國家的文字用數字來表示,并一一對應,形成了編碼表。
|--常見碼表:
|--ASCII:一個字節中7位就已經可以表示英文中的內容了。
|--ISO8859-1:包含了ASCII,同時用了一個字節的最高位。
|--GB2312/GBK:用兩個字節表示各種文字。()
|--Unicode:國際標準碼表,全部用兩個字節表示各種文字(java中默認的就是用這個碼表,對于字符串使用的本地默認碼表是GBK)
|--UTF-8:一個字節能存的就用一個字節存儲,兩個字節存不了的用三個字節存儲。在編碼的時候會給每個字節加個標示頭。這樣做的好處是:標示相當清楚,只要讀取標示就可以知道該怎么去查表。
Eg:01010101 11010101 10101111 11101101 10101010 10111100
當讀取到第一個字符時,就回去查ASCII碼表,因為0開頭就是用一個字節存儲的,當讀第二個字節時,110開頭的時繼續讀下一個字節,因為UTF-8有固定的標示頭110開頭代表是存兩個字節,當讀到1110時會繼續讀三個字節,如果是GBK讀這些,讀到第一個字節時也會查表。因為ASCII碼表兼容,當讀到1時會繼續讀下一個字節。
面試題:char類型中能不能存儲一個漢字?
Eg:char ch='a';就是兩個字節,只是最高八位全部都是0;
Char類型變量是用來存儲Unicode編碼的字符,該編碼字符集中包含了漢字,
所以char類型的變量是可以存儲漢字,不過如果某些特殊的漢字沒有被包含在該字符集中,那么這個char類型變量中就不能存儲這個漢字,這些都是因為Unicode編碼表全部都是用兩個字節表示各種文字。
|--編碼:字符串變成字節數組(把看的懂的變成看不懂的)
編碼錯了是不可能改正的,如果編對了解錯了還是有可能改正的。
實現代碼:
|--解碼:字節數組變成字符串(把看不懂的變成看的懂的)
Eg:客戶端發送你好到服務端
你好--------->你好 -60,-29,-70,-61------>ISO8859-1進行解碼---->????------->對它進行編碼------->-60,-29,-70,-61--->對它進行解碼----->你好
|--聯通問題:
實現代碼:
public static void main(String[] args) throws UnsupportedEncodingException {
String str="聯通";
/*
* 11000001
10101010
11001101
10101000
通過這里發現聯通對應的四個字節的開頭正好是UTF-8對應存儲兩個字節的開頭,所以它在解碼的時候按照UTF-8的方式進行解碼
出現了亂碼
* */
byte[] buf=str.getBytes("GBK");
for(byte b:buf){
System.out.println(Integer.toBinaryString(b&0xff));//獲取二進制的方式,已經忘記了!注意復習!
}
}
本文版權歸黑馬程序員Java培訓學院所有,歡迎轉載,轉載請注明作者出處。謝謝!
作者:黑馬程序員Java培訓學院
首發:http://javaee.itheima.com/