在寫文件下載的時候遇到的一個問題,也就是下載的文件的文件名是中文的話,瀏覽器下載的時候可能是亂碼,解決方案如下:
因為從服務器向瀏覽器發送中文時,需要對內容進行URL編碼。
> 大部分瀏覽器使用如下方式即可解決亂碼問題:URLEncoder.encode(fileName, "utf-8");
> 但是火狐默認以Base64來解碼的,所以要為火狐單獨處理。
> 可以使用如下代碼來判斷瀏覽器的類型,然后進行不同的編碼處理
// 請求客戶端操作系統的信息
final String userAgent = request.getHeader("USER-AGENT");
if(userAgent.contains("Firefox")){
//是火狐瀏覽器,使用BASE64編碼
fileName = "=?utf-8?b?"+new BASE64Encoder().encode(fileName.getBytes("utf-8"))+"?=";
}else{
//給文件名進行URL編碼
//URLEncoder.encode()需要兩個參數,第一個參數時要編碼的字符串,第二個是編碼所采用的字符集
fileName = URLEncoder.encode(fileName, "utf-8");
}
然后再去設置響應頭,應該就沒問題了
response.setContentType(servletContext.getMimeType(fileName));
response.addHeader("Content-Disposition", "attachment; filename=" + fileName);
二、還有一種通用的方法,可能簡單點,但是如果文件名夾雜個別特殊符號,可能還會亂碼,不過對大多數帶有特殊符號的中文名還是好使的;
- 向將字符串用gbk進行解碼,然后在使用iso8859-1進行編碼
fileName = new String(fileName.getBytes("gbk"),"iso8859-1");
