JAVA servlet输出IE6下乱码

这几天又被IE6坑了,发现一个有趣的bug。
乱码图片截图:

比如用一个servlet做一个文件导出功能,导出的时候从页面上读取文件名。例如文件名 "ABC导出.xml",如果文件名中的中文字符时偶数,导出的时候就不会有乱码。如果文件名不是偶数时就会有乱码。
后来到网上查了一下还真有这么回事。

 
如题,如果servlet容器使用的是Tomcat,那么一般会在server.xml中配置URIEncoding来处理get传参的编码问题。由于我们项目中用了ckfinder,如果不配置URIEncoding的话,上传中文名字的图片时会显示不出来,因为会将图片路径中的中文转成unicode的形式而此时不能正确的对get解码。配置了URIEncoding以后,IE系列中7、8、9都没有问题,只有IE6时,貌似IE6对utf8的支持不完全,所以就算是自己在servlet或action中自行转码,也有问题,就是偶数个汉字可以,奇数个汉字,最后一个是乱码,就算一个字也如此。这时,就想到了不如在jsp中将参数先转成utf8编码格式的,再当参数放入,果然,测试通过。
Java代码  
<%  
String param = "";  
if(request.getAttribute("selectParam")!=null)  
{  
    param = request.getAttribute("selectParam").toString();  
    param = java.net.URLEncoder.encode(param,"UTF-8");  
    pageContext.setAttribute("selectParam",param);  
}  
%>  
 由于我的分页参数使用了selectParam,所以在此之前我先将该属性从request中取到,编码后再放入page作用域,
这样下面使用EL表达式取值的时候就是我编码以后的值了。

红色字体来源于网络

但是上面内容说是用jsp,但是我的工程中前台只用到了js,html。没有jsp,这该如果转换呢?
研究后发现可以这样:
可以把中文字符转换一下,例如: 
前台js代码参考如下 
function exportXml(mibId,name) { 
var url = "http://www.cnblogs.com/servlet/BmpExportMibXmlServlet?flag=1"; 
var mibName = name+".xml"; 
url = url+"&mibId="+mibId+"&mibName="+encodeURI(mibName); 
window.open(url, ""); 


其中encodeURI(mibName)就是要转换的内容。 

这样再到后台编写如下代码: 
  String mibName = new String(req.getParameter("mibName").getBytes("ISO-8859-1"), "UTF-8"); 
  resp.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(mibName, "UTF-8")); 

以下这两句很重要 
String mibName = new String(req.getParameter("mibName").getBytes("ISO-8859-1"), "UTF-8"); 
URLEncoder.encode(mibName, "UTF-8") 
这样servlet输出名字时在IE6下就不会有乱码了. 

原文地址:https://www.cnblogs.com/liwei45212/p/3028535.html