JAVA的IED編譯環境對編碼的影響:

 【根據實驗和理論總結,不對之處,敬請指出,分享和完善】

 

JAVA的IED編譯環境對編碼的影響:

 

  IDE編譯環境編碼: UTF-8

   測試源文件:d:/測試中文testchinese.html 文件編碼爲UTF-8編碼,

內容爲:測試中文test。

 

  public static void testUTF8() throws Exception

    {

       java.io.FileInputStream is=new java.io.FileInputStream("d:/測試中文test.html");

       byte[] b=new byte[1024];

       int len=is.read(b);

       byte[] bb=new byte[len];

       System.arraycopy(b, 0, bb, 0, len);

       String str=new String(bb);

       System.out.println(str+""+bb.length);

       for(byte b1:bb)

       {

           System.out.println(Integer.toHexString(b1));

        }

    }

  結果:字節數組長度爲16,str的長度8,  中文可以正確顯示,原因是編譯的IDE環境是UTF-8,如果此時傳值“測試中文test”給服務器進行遠程存儲,服務器的解析編碼如果是UTF-8,那麼可以正確解析該文件的文件名,而不會亂碼。

   測試中文test16

ffffffe6

ffffffb5

ffffff8b

ffffffe8

ffffffaf

ffffff95

ffffffe4

ffffffb8

ffffffad

ffffffe6

ffffff96

ffffff87

74

65

73

74

 

 

IDE編譯環境編碼:GBK

   測試源文件:d:/測試中文testchinese.html 文件編碼爲UTF-8編碼,

內容爲:測試中文test。

  此時執行上述代碼, 結果爲亂碼。字節數組長度爲16,str的長度爲10,可以看出有10個字符。

嫺嬭瘯涓枃test16

ffffffe6

ffffffb5

ffffff8b

ffffffe8

ffffffaf

ffffff95

ffffffe4

ffffffb8

ffffffad

ffffffe6

ffffff96

ffffff87

74

65

73

74 

 

修改代碼增加str=new String(str.getBytes("GBK"),"UTF-8");

  public static void testUTF8() throws Exception

    {

       java.io.FileInputStream is=new java.io.FileInputStream("d:/測試中文testchinese.html");

       byte[] b=new byte[1024];

       int len=is.read(b);

       byte[] bb=new byte[len];

       System.arraycopy(b, 0, bb, 0, len);

       String str=new String(bb);

       str=new String(str.getBytes("GBK"),"UTF-8");

       System.out.println(str+""+bb.length);

       for(byte b1:bb)

       {

           System.out.println(Integer.toHexString(b1));

        }

    }

執行結果爲:字節數組爲16,str長度爲8,正常中文。

測試中文test16

ffffffe6

ffffffb5

ffffff8b

ffffffe8

ffffffaf

ffffff95

ffffffe4

ffffffb8

ffffffad

ffffffe6

ffffff96

ffffff87

74

65

73

74

 

結論:首先應該從環境的編碼理解。

      1 Java源文件的編碼

      2 Java編譯後的執行編碼

      3 操作系統的編碼

  

   Java源文件的編碼是編程時的文件編碼,如果在eclipse中設置爲GBK,則文件編碼爲GBK,而編譯後的執行編碼class文件則是以unicode utf-8存儲,這樣就可以保證在不同的編碼環境下的源文件不會影響class文件的編碼,它可以在不同的編碼平臺上執行,但是源文件如果是GBK編碼的就不能在UTF-8下被正確顯示,例如在中文windows環境下的中文在linux的英文環境下中文編碼的十六進制爲3f,字符爲?,反過來一樣甚至不能保存,原因在於GBK的代碼範圍小於UTF-8,當某些UTF-8的編碼在GBK中無對應時會無法保存源文件。

一個有趣的現象是,eclipse中反覆改變文件編碼後,中文會變成亂碼。原因就在於反覆進行編碼成亂碼和再對亂碼編碼的原因。

   GBK編碼的一箇中文字符爲兩個字節,unicode的中文編碼爲3個字節,因此就會出現4個utf-8編碼的中文在GBK編碼下是6個,

   如果在純java的環境下運行,是不用擔心編碼問題,無論什麼樣的源文件編碼都會被對應的變爲unicode編碼,保證其在不同的操作系統環境下一致。

   上述UTF-8的編碼文件讀取後,顯示的結果是GBK的編碼結果,因此被強行有3個字節解析爲2個字節,12個字節被解析爲6個GBK編碼存儲後的unicode漢字,因此如果要顯示爲正確的中文,需要做操作str=new String(str.getBytes("GBK"),"UTF-8");,此時會首先將unicode存儲的6個漢字的亂碼按GBK編碼的形式獲取字節數組,這就是原始未發生任何變化的字節數組了,此時再按照UTF-8編碼會變爲正確的4個漢字,這4個漢字會自動翻譯爲class的unicode編碼,無論怎麼書寫編碼轉換語句,只要是正常的中文編碼都會生成一模一樣的class編碼。

   因此可以清楚的看到文件的編碼是如何影響程序的編寫。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章