用户使用不同的浏览器下载文件的时候,在一些情况下会出现中文乱码的情况:
用户在国产操作系统使用低版本firefox,使用国产中间件进行文件下载时,会出现中文乱码,甚至有时候中文不显示的问题。
问题原因,有可能是浏览器默认编码问题,也有可能是中间件处理问题。但是这些我们都不可控。
假如,程序里面使用UTF-8编码。
解决一:
低版本firefox默认使用了iso-8851-1.所以可以在其中判断是哪种浏览器,对文件件名进行编码
//根据浏览器种类进行不同编码
if (getBrowser(request).equals("FF")) {//如果是火狐,解决火狐中文名乱码问题
fileName = new String(fileName.getBytes("UTF-8"), "iso-8859-1");
}
response.setHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\"");
附:
//获取浏览器种类,此处只列举了简单几种
private String getBrowser(HttpServletRequest request) {
String header = request.getHeader("USER-AGENT");
if (header != null) {
String UserAgent = header.toLowerCase();
if (UserAgent != null) {
if (UserAgent.indexOf("msie") >= 0) {
return "IE";
} else if (UserAgent.indexOf("firefox") >= 0) {
return "FF";
} else if (UserAgent.indexOf("safari") >= 0) {
return "SF";
}
}
}
return "";
}
解决二:
但是对于中间件产生问题,上述方法就不能起作用了。
根据https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Content-Disposition
“Content-Disposition”的参数中,filename有两种方式。
filename*后可以指定文件名的编码
"Content-Disposition" "attachment;filename*=UTF-8''中文.txt"
String dispositionHeader = "attachment;filename*=UTF-8''" + fileName + "";
response.setHeader("Content-Disposition", dispositionHeader);
这样,不论在什么浏览器,均可以正常下载