源文件與操作系統文件編碼衝突導致中文亂碼問題

問題:Java Web程序中,開發環境是XP系統,原有程序保存的內容一起正常,到了部署環境是Linux,保存XML文件內容時出現中文亂碼問題。中文內容使用ajax提交過來,在ACTION中URLDecoder.decode(BaseUtil.toString(request.getParameter("desc")),"utf-8")獲取,兩種操作系統環境下在ACTION中拿到的中文內容打印出來是正確的,但以文件流形式保存到本地文件系統(.xml)中時產生了區別:linux下的操作系統,保存中文(到XML文件,xml的encoding爲GBK)設置爲GBK時,亂碼,xml設置爲UTF-8以及中文內容設置爲UTF-8時正確;windows下的操作系統,設置爲GBK時,正確。
錯誤原因:經過調試,發現是文件內容元編碼與不同操作系統文件編碼相互衝突導致的,對操作系統不太熟悉,估計是當時的開發環境的Window系統是GBK的,而部署環境的Linux操作系統是UTF-8的。
解決方式:大概來看,在傳遞到ACTION中正常的中文內容,在Windows下寫入的流和文件的編碼都設置爲GBK、Linux下都設置爲UTF-8可以避免亂碼問題(保存的文件編碼與操作系統的一致).另外,一個統一的解決方法是,文件寫入流使用FileOutputStream而不使用FileWriter

...
OutputFormat format = OutputFormat.createPrettyPrint();
FileOutputStream fos = new FileOutputStream(fileURL);
XMLWriter writer = new XMLWriter(fos, format);
...
//以下的方式在不同的操作系統下有差異,會出現亂碼
//OutputFormat format = OutputFormat.createPrettyPrint();
//format.setEncoding("UTF-8");
//XMLWriter writer = new XMLWriter(new FileWriter(new File(fileURL)),format);
...

一些詳細的測試見附件。
小結:這個屬於文件源編碼與操作系統文件編碼的問題,如果內容編碼與操作系統的編碼不一致就會出現亂碼。FileOutputStream類的接口估計是使用當前操作系統默認的文件編碼,具有教好的可移植性
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章