导出文件乱码问题处理(java)

时间:2021-04-05 23:47:06
  最近在处理业务时,之前一个很正常的功能,因为换了一个服务器环境(由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);

导出文件乱码问题处理(java)

 
最新版产品中,更新新乐jdk1.7,在linux环境下时,以该种方式下,导出文件在ie直接乱码,在chrome中呈现“-----”乱码符号。
 
    一开始以为是GB2312不能转换一些特殊汉字导致,改为GBK,问题依旧;
 
    后来想着是不是需要转为统一UTF-8编码,还是不行。
 
在网上搜索资料,有人提到,ie和火狐等其他浏览器需要分开判断于是有了下面的解决方案:
  导出文件乱码问题处理(java)
 
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的方式,直接采用
 
导出文件乱码问题处理(java)
 
//采用该种方法
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字符集编码: