在Java的web开发中,文件下载功能的文件名文件名乱码问题是经常遇到的。
对于这个问题,不同的浏览器,解决的方法不太一样。
IE的话,通过URLEncoder对filename进行UTF8编码。
而其他的浏览器(firefox、chrome、safari、opera),则要通过字节转换成ISO8859-1了。
示例代码(通过测试):
/**
* 下载文件名中含有中文的处理
* @param req
* @param headName
* @return
* @throws UnsupportedEncodingException
*/
public static String encodeFileName(HttpServletRequest req, String headName)
throws UnsupportedEncodingException {
String filename="";//IE9之前包括IE9都包含MSIE;IE10之后都包含Trident;edge浏览器包含Edge
String userAgent=req.getHeader("User-Agent");
if (userAgent.contains("MSIE") ||userAgent.contains("Trident")||userAgent.contains("Edge")) {
filename = URLEncoder.encode(headName, "UTF-8");
} else {
filename = new String(headName.getBytes("UTF-8"), "ISO8859-1");
}
return filename;
}
另外:
IE6下注意
中文文字不能超过超过17个。
所以更稳妥的方法是:
/**
* 下载文件名中含有中文的处理
* @param req
* @param headName
* @return
* @throws UnsupportedEncodingException
*/
public static String encodeFileName(HttpServletRequest req, String headName)
throws UnsupportedEncodingException {
String filename="";//IE9之前包括IE9都包含MSIE;IE10之后都包含Trident;edge浏览器包含Edge
String userAgent=req.getHeader("User-Agent");
if (userAgent.contains("MSIE") ||userAgent.contains("Trident")||userAgent.contains("Edge")) {
if(filename.length()>150){//解决IE 6.0 bug
filename=new String(headName.getBytes("UTF-8"),"ISO-8859-1");
}else{
filename = URLEncoder.encode(headName, "UTF-8");
}
} else {
filename = new String(headName.getBytes("UTF-8"), "ISO8859-1");
}
return filename;
}
不过由于IE6基本已经退出历史舞台,所以用第一种方法也基本上是没问题的。
附: 获取浏览器user-agent的方法
参考文章:java文件下载文件名乱码