论坛首页 入门技术论坛

源文件与操作系统文件编码冲突导致中文乱码问题

浏览 1815 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-09-14  
问题: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类的接口估计是使用当前操作系统默认的文件编码,具有教好的可移植性
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics