【根據實驗和理論總結,不對之處,敬請指出,分享和完善】
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編碼。
因此可以清楚的看到文件的編碼是如何影響程序的編寫。