源文件与操作系统文件编码冲突导致中文乱码问题 博客分类: 工作 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
一些详细的测试见附件。
小结:这个属于文件源编码与操作系统文件编码的问题,如果内容编码与操作系统的编码不一致就会出现乱码。FileOutputStream类的接口估计是使用当前操作系统默认的文件编码,具有教好的可移植性
错误原因:经过调试,发现是文件内容元编码与不同操作系统文件编码相互冲突导致的,对操作系统不太熟悉,估计是当时的开发环境的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类的接口估计是使用当前操作系统默认的文件编码,具有教好的可移植性