在JDK 1.4中存在一個(gè)有關(guān)編碼的問題。簡要描述如下:
通過參數(shù)-Dfile.encoding="charset"設(shè)定特定的字符集,但是并不會(huì)被當(dāng)作Reader或者Writer的默認(rèn)字符集使用。這個(gè)問題,有時(shí)候會(huì)引起隱藏較深的亂碼問題。JDK 1.5和1.6中此問題已經(jīng)不存在,所以,如果遇到在同樣默認(rèn)字符集系統(tǒng)上面運(yùn)行,基于JDK 1.5正常,基于JDK 1.4則出現(xiàn)亂碼問題的時(shí)候,注意一下是否由于此問題引起。
(原來JDK 1.4的這個(gè)bug在腦子中特別清晰,最近忘了,頭兩天遇到了,搞了半天~_~。發(fā)出來吧,也給大家提個(gè)醒)
測試程序如下:
1 public static void main(String[] args) {
2 try {
3 File file = new File("D:/text.txt");
4 file.createNewFile();
5 InputStreamReader reader = new InputStreamReader(new FileInputStream(file));
6 OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(file));
7 System.out.println(reader.getEncoding());
8 System.out.println(writer.getEncoding());
9 } catch (IOException e) {
10 e.printStackTrace();
11 }
12 }
【執(zhí)行環(huán)境】
Windows XP中文,默認(rèn)系統(tǒng)字符集是GBK
啟動(dòng)參數(shù)設(shè)置:-Dfile.encoding=utf-8
在JDK 1.4.2版本上輸出如下:
GBK
GBK
在JDK 1.5.0_09版本上輸出如下:
UTF8
UTF8
由以上測試結(jié)果可以看出,在JDK 1.4上面,通過參數(shù)-Dfile.encoding="charset"設(shè)定特定的字符集,但是并不會(huì)被當(dāng)作Reader或者Writer的默認(rèn)字符集使用在JDK 1.4版本上面,此可能引起很多問題,例如read的部分是由于某開源庫完成,則內(nèi)部實(shí)現(xiàn)可能強(qiáng)制采用了-Dfile.encoding的配置;輸出由我們自己完成,則默認(rèn)的writer并不會(huì)默認(rèn)采用-Dfile.encoding的設(shè)置,這樣解碼和編碼用的字符集就不一致,可能就會(huì)引起亂碼問題。
簡而言之,在JDK 1.4上開發(fā),在利用字符流編解碼需要依賴-Dfile.encoding設(shè)置的時(shí)候,要注意此問題。
附加說明:
1、可以對InputStreamReader和OutputStreamWriter兩個(gè)wrapper設(shè)定明確的編輯碼字符集
2、如果像和當(dāng)前系統(tǒng)的-Dfile.encoding設(shè)置保持絕對一直,可以將System.getProperty("file.encoding")傳入InputStreamReader和OutputStreamWriter
本博客中的所有文章、隨筆除了標(biāo)題中含有引用或者轉(zhuǎn)載字樣的,其他均為原創(chuàng)。轉(zhuǎn)載請注明出處,謝謝!