欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

源文件与操作系统文件编码冲突导致中文乱码问题 博客分类: 工作 LinuxXMLXPAjaxWindows 

程序员文章站 2024-02-03 13:54:16
...
问题: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类的接口估计是使用当前操作系统默认的文件编码,具有教好的可移植性