最近在處理業務時,之前一個很正常的功能,因為換了一個服務器環境(由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字符集編碼: