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