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