我发现了可以在我安装的所有浏览器(IE8,FF16,Opera12,Chrome22)中使用的解决方案。
这是基于以下事实:如果未指定[不同]编码,则浏览器期望使用filenames参数的值,该参数以浏览器的本机编码进行编码。
通常,浏览器的本机编码为utf-8(FireFox,Opera,Chrome)。但是IE的本机编码是Win-1250。
因此,如果我们根据用户的浏览器将值放入由utf-8 / win-1250编码的文件名参数中,它应该可以工作。至少,它对我有用。
String fileName = "árvíztűrőtükörfúrógép.xls";String userAgent = request.getHeader("user-agent");boolean isInternetExplorer = (userAgent.indexOf("MSIE") > -1);try { byte[] fileNameBytes = fileName.getBytes((isInternetExplorer) ? ("windows-1250") : ("utf-8")); String dispositionFileName = ""; for (byte b: fileNameBytes) dispositionFileName += (char)(b & 0xff); String disposition = "attachment; filename="" + dispositionFileName + """; response.setHeader("Content-disposition", disposition);} catch(UnsupportedEncodingException ence) { // ... handle exception ...}当然,仅在上述浏览器上对此进行了测试,我不能保证100%可以一直在任何浏览器中使用。
注意#1(@fallen)
:使用URLEnprer.enpre()方法不正确。尽管有方法的名称,但它并未将字符串编码为URL编码,但确实将其编码为表单编码。(格式编码与URL编码非常相似,在很多情况下,它产生相同的结果。但是存在一些差异。例如,空格字符“”被编码为不同:“
+”而不是“%20”))
对于正确的URL编码字符串,您应该使用URI类:
URI uri = new URI(null, null, "árvíztűrőtükörfúrógép.xls", null);System.out.println(uri.toASCIIString());



