java中的字符集編碼入門java代碼中的字符編碼轉(zhuǎn)換part1

java中的字符集編碼入門java代碼中的字符編碼轉(zhuǎn)換part1

ID:8966827

大?。?7.50 KB

頁數(shù):3頁

時間:2018-04-13

java中的字符集編碼入門java代碼中的字符編碼轉(zhuǎn)換part1_第1頁
java中的字符集編碼入門java代碼中的字符編碼轉(zhuǎn)換part1_第2頁
java中的字符集編碼入門java代碼中的字符編碼轉(zhuǎn)換part1_第3頁
資源描述:

《java中的字符集編碼入門java代碼中的字符編碼轉(zhuǎn)換part1》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫

1、如果你是JVM的設(shè)計者,讓你來決定JVM中所有字符的表示形式,你會不會允許使用各種編碼方式的字符并存?我想你的答案是不會,如果在內(nèi)存中的Java字符可以以GB2312,UTF-16,BIG5等各種編碼形式存在,那么對開發(fā)者來說,連進(jìn)行最基本的字符串打印、連接等操作都會寸步難行。例如一個GB2312的字符串后面連接一個UTF-8的字符串,那么連接后的最終結(jié)果應(yīng)該是什么編碼的呢?你選哪一個都沒有道理。因此牢記下面這句話,這也是Java開發(fā)者的共同意志:在Java中,字符只以一種編碼形式存在,那就是UTF-16。但“在Java中”到底是指在哪里呢?就是指在JVM中,在內(nèi)存中,在你的代碼里聲明

2、的每一個char,String類型的變量中。例如你在程序中這樣寫charhan='漢';在內(nèi)存的相應(yīng)區(qū)域,這個字符就表示為0x6C49??梢杂孟旅娴拇a證明一下:charhan='漢';System.out.format("%x",(short)han);輸出是:6c49反過來用UTF-16編碼來指定一個字符也可以,像這樣:charhan=0x6c49;System.out.println(han);輸出是:漢這其實(shí)也是說,只要你正確的讀入了“漢”這個字,那么它在內(nèi)存中的表示形式一定是0x6C49,沒有任何其他的值能代表這個字(當(dāng)然,如果你讀錯了,那結(jié)果是什么就不知道了,范偉說:讀,讀

3、錯了呀,那還等于好幾億呢;本山大哥說:好幾億你也沒答上,請聽下一題)。JVM的這種約定使得一個字符存在的世界分為了兩部分:JVM內(nèi)部和OS的文件系統(tǒng)。在JVM內(nèi)部,統(tǒng)一使用UTF-16表示,當(dāng)這個字符被從JVM內(nèi)部移到外部(即保存為文件系統(tǒng)中的一個文件的內(nèi)容時),就進(jìn)行了編碼轉(zhuǎn)換,使用了具體的編碼方案(也有一種很特殊的情況,使得在JVM內(nèi)部也需要轉(zhuǎn)換,不過這個是后話)。因此可以說,所有的編碼轉(zhuǎn)換就只發(fā)生在邊界的地方,JVM和OS的交界處,也就是你的各種輸入輸出流(或者Reader,Writer類)起作用的地方。話頭扯到這里就必須接著說Java的IO系統(tǒng)。盡管看上去混亂繁雜,但是所有的I

4、O基本上可以分為兩大陣營:面向字符的Reader啊Wrtier啊,以及面向字節(jié)的輸入輸出流。下面我來逐一分解,其實(shí)一點(diǎn)也不難。面向字符和面向字節(jié)中的所謂“面向”什么,是指這些類在處理輸入輸出的時候,在哪個意義上保持一致。如果面向字節(jié),那么這類工作要保證系統(tǒng)中的文件二進(jìn)制內(nèi)容和讀入JVM內(nèi)部的二進(jìn)制內(nèi)容要一致。不能變換任何0和1的順序。因此這是一種非?!爸覍?shí)于原著”的做法(偶然間讓我想起郭敬明抄襲莊羽的文章,那家伙,太忠實(shí)于原著了,笑)。這種輸入輸出方式很適合讀入視頻文件或者音頻文件,或者任何不需要做變換的文件內(nèi)容。而面向字符的IO是指希望系統(tǒng)中的文件的字符和讀入內(nèi)存的“字符”(注意和字

5、節(jié)的區(qū)別)要一致。例如我們的中文版WindowsXP系統(tǒng)上有一個GBK的文本文件,其中有一個“漢”字,這個字的GBK編碼是0xBABA(而UTF-16編碼是0x6C49),當(dāng)我們使用面向字符的IO把它讀入內(nèi)存并保存在一個char型變量中時,我希望IO系統(tǒng)不要傻傻的直接把0xBABA放到這個char型變量中,我甚至都不關(guān)心這個char型變量具體的二進(jìn)制內(nèi)容到底是多少,我只希望這個字符讀進(jìn)來之后仍然是“漢”這個字。從這個意義上也可以看出,面向字符的IO類,也就是Reader和Writer類,實(shí)際上隱式的為我們做了編碼轉(zhuǎn)換,在輸出時,將內(nèi)存中的UTF-16編碼字符使用系統(tǒng)默認(rèn)的編碼方式進(jìn)行了

6、編碼,而在輸入時,將文件系統(tǒng)中已經(jīng)編碼過的字符使用默認(rèn)編碼方案進(jìn)行了還原。我兩次提到“默認(rèn)”,是說Reader和Writer的聰明也僅此而已了,它們只會使用這個默認(rèn)的編碼來做轉(zhuǎn)換,你不能為一個Reader或者Writer指定轉(zhuǎn)換時使用的編碼。這也意味著,如果你使用中文版WindowsXP系統(tǒng),而上面存放了一個UTF-8編碼的文件,當(dāng)你使用Reader類來讀入的時候,它會傻傻的使用GBK來做轉(zhuǎn)換,轉(zhuǎn)換后的內(nèi)容當(dāng)然驢唇不對馬嘴!這種笨,有時候其實(shí)是一種傻瓜式的功能提供方式,對大多數(shù)初級用戶(以及不需要跨平臺的高級用戶)來說反而是件好事。但我們不一樣啦,我們都是國家棟梁,肩負(fù)著趕英超美的責(zé)任

7、,必須師夷長技以治夷,所以我們總還要和GBK編碼以外的文件打交道。說了上面這些內(nèi)容,想必聰明的讀者已經(jīng)看出來,所謂編碼轉(zhuǎn)換就是一個字符與字節(jié)之間的轉(zhuǎn)換,因此Java的IO系統(tǒng)中能夠指定轉(zhuǎn)換編碼的地方,也就在字符與字節(jié)轉(zhuǎn)換的地方,那就是(讀者:InputSteamReader和OutputStreamWriter!作者:太強(qiáng)了,都會搶答了!)這兩個類是字節(jié)流和字符流之間的適配器類,因此他們肩負(fù)著編碼轉(zhuǎn)換的任務(wù)簡直太自然啦!要注意,實(shí)際上也只能在這

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動畫的文件,查看預(yù)覽時可能會顯示錯亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負(fù)責(zé)整理代發(fā)布。如果您對本文檔版權(quán)有爭議請及時聯(lián)系客服。
3. 下載前請仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時可能由于網(wǎng)絡(luò)波動等原因無法下載或下載錯誤,付費(fèi)完成后未能成功下載的用戶請聯(lián)系客服處理。