dom4j 寫文件編碼問題

網上有很多介紹dom4j的使用的文章,包括官方自己的舉例。但是在寫或者修改xml文件時,如果直接按教程方法寫,就會遭遇編碼問題,往往會報遇到不可 識別的符號的錯誤。而在windows系統下,用記事本打開可能看起來很正常似的,比如看到xml編碼標籤那寫的<?xml version="1.0" encoding="UTF-8"?>這樣的格式。細心的人用EditPlus打開,就會發現編碼實際上並非utf-8,可能是gbk。我們來看寫文件時用到的XMLWriter,他提供以下幾種構造方法:

XMLWriter()
XMLWriter(OutputFormatformat)
XMLWriter(OutputStreamout)
XMLWriter(OutputStreamout, OutputFormatformat)
XMLWriter(Writerwriter)
XMLWriter(Writerwriter, OutputFormatformat)

最簡單常用的可能是new XMLWriter(new FileWriter(...))這樣的形式。可如果你一旦這麼用,就會造成編碼問題。由於dom4j對於文件編碼的選擇是才用java本身類的處理方式 (可以從源碼看到),這麼寫就是採用FileWriter的處理方式,而FileWriter是不提供對編碼的處理的。於是會調用系統自身的編碼,比如用 中文操作系統,編碼方式就是gbk,然後默認的,他赫然會在文件頭寫上<?xml version="1.0" encoding="UTF-8"?>。也就是說,他以當前操作系統的編碼保存文件,並且竟然自動添加文件頭為"utf-8"格式,這會導致很多程 序無法讀取正確編碼,而且具有很差的移植性(比如在windows下開發,放到linux伺服器下跑,畢竟一般linux伺服器默認local都是 utf-8)。解決途徑一:使用new XMLWriter(new FileOutputStream(...))方法。這樣做,因為dom4j默認使用utf-8編碼,即xml文件頭默認編碼方式,並且內容也會使用utf-8保存,這樣可以做到一致的編碼,不會出問題。解決途徑二:使用new XMLWriter(new FileOutputStream(...), outputFormat)的構造方法。OutputFormat xmlFormat = OutputFormat.createPrettyPrint();xmlFormat.setEncoding("utf-8");XmLWriter writer = new XMLWriter(new FileOutputStream(...), xmlFormat);writer.write(document);writer.close();如上,setEncoding可以設置存儲的文件編碼格式,createPrettyPrint是得到美化xml格式輸出。這樣的話,在不同的環境下可以獲得同樣的編碼讀寫,並且真正保證了文件標稱與實際編碼的一致性。【注意】如 果你使用OutputFormat是為了設置文件編碼,那千萬別用 XMLWriter(new FileWriter(...), outputFormat)構造方法,因為前面已經說了,FileWriter不會處理編碼,所以即使你使用 format.setEncoding("utf-8");他仍然不會使用utf-8編碼,而只是把文件頭指定為utf-8,這類似不使用 outputFormat的情況。而網上好多人舉例用了XMLWriter writer=newXMLWriter(newFileWriter("output.xml"),format); 那是因為他們format.setEncoding("gbk");而windows默認就是gbk,這當然使實際編碼與標稱的配套了。但實際上,這種方 法是不正確的,java並沒有按你寫的"gbk"進行編碼,而是使用了系統默認編碼而已,放到linux就會出現錯誤,所以一定的小心。把編碼交給操作系統來控制一向是罪惡的,包括java其他地方的參數傳遞等,如request的參數傳遞,其他文件讀寫,如果不使用編碼過濾器,不進行編 碼指定,可能使得整個系統失去移植性,併產生完全不可預期的錯誤。找起來頭大不說,有時候看到encoding="UTF-8",實際上卻是gkb編碼會 讓你錯過關鍵調試點。還有就是記事本的罪惡性,用記事本打開不同編碼的文件,往往得不到預期的效果,而且你無從得知他到底是用何種編碼打開,一般使用EditPlus指定編碼打開會好很多。
推薦閱讀:

Base64編碼
徹底搞懂編碼 GBK 和 UTF8
藥品的分類與分類編碼
深度報文檢測基礎之編解碼
DRGs應用下,疾病編碼常見問題有哪些?

TAG:編碼 | 文件 | 問題 |