導出文件亂碼問題處理(java)


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM