最近在处理业务时,之前一个很正常的功能,因为换了一个服务器环境(由windows到linux),导出文件时文件名fileName突然就变成了乱码,无论如何转变编码方式,总不得其解,最终采用无论前后台,均不通过转为GBK或先转为ISO-8850-1再转为GBK和UTF-8的方式,而是直接前后统一使用UTF-8编码才正常。
最开始使用方法(代码中用了6年的方法):
fileName = new String(infor.getBytes("GB2312"), "ISO-8859-1"); response.setHeader("Content-disposition", "attachment; filename=" + fileName);
最新版产品中,更新新乐jdk1.7,在linux环境下时,以该种方式下,导出文件在ie直接乱码,在chrome中呈现“-----”乱码符号。
一开始以为是GB2312不能转换一些特殊汉字导致,改为GBK,问题依旧;
后来想着是不是需要转为统一UTF-8编码,还是不行。
在网上搜索资料,有人提到,ie和火狐等其他浏览器需要分开判断于是有了下面的解决方案:
String userAgent = request.getHeader("User-Agent"); //针对IE或者以IE为内核的浏览器: if (userAgent.contains("MSIE")||userAgent.contains("Trident")) { fileName = java.net.URLEncoder.encode(fileName, "UTF-8"); } else { //非IE浏览器的处理: fileName = new String(fileName.getBytes("UTF-8"),"ISO-8859-1"); } response.setHeader("Content-Type","application/msexcel"); response.setHeader("Content-disposition", String.format("attachment; filename=\"%s\"", fileName)); response.setContentType("application/vnd.ms-excel;charset=utf-8");
经过这次修改,ie下如愿以偿的得到了正确编码,但是chrome问题依旧,最后干脆就直接采用统一的编码,前后端都用UTF-8,均不通过转为GBK或先转为ISO-8850-1再转为GBK和UTF-8的方式,直接采用
//采用该种方法 fileName = java.net.URLEncoder.encode(fileName, "UTF-8"); response.setHeader("Content-Type","application/msexcel"); response.setHeader("Content-disposition", String.format("attachment; filename=\"%s\"", fileName)); response.setContentType("application/vnd.ms-excel;charset=utf-8");
这下不论是在ie还是在chrome,都呈现了正常编码。问题得以解决。
另外贴上开源中国"taote"老师的一篇文章--java字符集编码: