关于中文文件下载的问题,网上的咨询和答疑已经很多,我原来处理下载的代码如下:
response.setHeader("Content-Disposition", "attachment; filename=" + java.net.URLEncoder.encode(fileName, "UTF-8"));
下载的程序里有了这句,一般在IE6的下载提示框上将正确显示文件的名字,无论是简体中文,还是日文。不过当时确实没有仔细测试文件名很长的中文文件名。先如今经过仔细测试,发现文字只要超过17个字,就不能下载了。经过好一番google和反复测试,总算对这个问题有了系统的认识,分列如下:
一. 通过我原来的方式,也就是先用URLEncoder编码,当中文文字超过17个时,IE6 无法下载文件。这是IE的bug,参见微软的知识库文章 KB816868 。原因可能是因为ie在处理 Response Header 的时候,对header的长度限制在150字节左右。而一个汉字编码成UTF-8是9个字节,那么17个字便是153个字节,所以便会报错。微软提供了一个补丁,可以从 这里 下载。这个补丁需要先安装ie6 sp1。因为我平时勤打补丁,我的IE6版本号是 6.0.2800.1106.xpsp2_xxxxx。所以我可能已经安装过了补丁,从而可以下载,但仍然出现文件名被截断的现象。微软让我们等待IE下一个service pack的发布。我今天也上网看到了好消息,迫于firefox的压力,IE7可能在年中发布。另外,Firefox 不支持这样的方式,将把编码后的%xx%xx直接作为文件名显示。
二. 我尝试使用 javamail 的MimeUtility.encode()方法来编码文件名,也就是编码成 =?gb2312?B?xxxxxxxx?= 这样的形式,并从 RFC1522 中找到对应的标准支持。不过很遗憾,IE6并不支持这一个标准。我试了一下,Firefox是支持的。
三. 按网上很多人提供的解决方案:将文件名编码成ISO8859-1似乎是有效的解决方案,代码如下:
response.setHeader( "Content-Disposition", "attachment;filename=" + new String( fileName.getBytes("gb2312"), "ISO8859-1" ) );
在确保附件文件名都是简体中文字的情况下,那么这个办法确实是最有效的,不用让客户逐个的升级IE。如果台湾同胞用,把gb2312改成big5就行。但现在的系统通常都加入了国际化的支持,普遍使用UTF-8。如果文件名中又有简体中文字,又有繁体中文,还有日文。那么乱码便产生了。另外,在我的电脑上Firefox(v1.0-en)下载也是乱码。
折中考虑,我结合了一、三的方式,代码片断如下:
String fileName = URLEncoder.encode(atta.getFileName(), "UTF-8");
/*
* see http://support.microsoft.com/default.aspx?kbid=816868
*/
if (fileName.length() > 150) {
String guessCharset = xxxx /*根据request的locale 得出可能的编码,中文操作系统通常是gb2312*/
fileName = new String(atta.getFileName().getBytes(guessCharset), "ISO8859-1");
}
response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
暂且不考虑 Firefox 是因为它目前似乎还没有有力侵食到IE的企业用户市场。影响客户买单的常常是进度,而不是兼容度。
----------------------------------------------
但还有个问题是:文件名中有空格的时候,会把空格变成了“+”。
解决转换空格
String fileName = StringUtils.trim(file.getName());
String formatFileName = encodingFileName(name);//在后面定义方法encodingFileName(String fileName);
response.setHeader("Content-Disposition", "attachment; filename=" + formatFileName );
//处理文件名中出现的空格
//其中%20是空格在UTF-8下的编码
public static String encodingFileName(String fileName) {
String returnFileName = "";
try {
returnFileName = URLEncoder.encode(fileName, "UTF-8");
returnFileName = StringUtils.replace(returnFileName, "+", "%20");
if (returnFileName.length() > 150) {
returnFileName = new String(fileName.getBytes("GB2312"), "ISO8859-1");
returnFileName = StringUtils.replace(returnFileName, " ", "%20");
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
if (log.isWarnEnabled()) {
log.info("Don't support this encoding ...");
}
}
return returnFileName;
}
转:[http://blog.csai.cn/user1/14698/archives/2006/9355.html]
分享到:
相关推荐
在本文中,我们将深入探讨如何解决使用Ajax进行POST请求时出现的中文乱码问题。首先,我们要理解Ajax中文乱码的根源,它通常涉及到字符编码的不一致,尤其是在客户端与服务器之间的通信过程中。 Ajax(Asynchronous...
此外,对于中文文件名的支持也是一个重要的方面,通过适当的方法可以确保文件名在下载过程中不会出现乱码问题。希望这些知识点能够帮助开发者更好地掌握JSPSmartUpload的使用技巧,提高开发效率。
8. **注意事项**:确保在整个Web应用程序中保持编码的一致性,包括数据库连接、文件读写、响应输出等环节,都应使用相同的字符编码,以避免出现乱码问题。 总之,解决URL乱码问题需要理解URL编码机制,正确设置页面...
在JavaServer Pages (JSP) 开发中,页面间的参数传递是常见的操作,尤其是在处理包含汉字的参数时,由于编码问题可能会导致乱码。本文主要介绍如何在JSP中正确地进行汉字参数的转码与解码,确保数据在页面间传递时...
对于POST提交的中文乱码问题,解决方案通常涉及到前端的编码和后端的解码: 1. **前端编码**: - 在JavaScript中,使用`encodeURI`或`encodeURIComponent`函数将包含中文的字符串进行编码。需要注意的是,对于POST...
7. **文件流处理**:在处理文件上传或下载时,注意文件流的编码设置,避免在读写过程中出现乱码。 8. **其他编码相关问题**:除了JSP页面,还需要检查CSS、JavaScript和其他静态资源文件的编码设置,确保它们与页面...
需要注意的是,gb2312 编码只能正确地显示简体中文字符,对于繁体中文字符可能会出现乱码。因此,如果您的 JSP 页面需要显示繁体中文字符,需要使用其他编码标准,例如 Big5 编码。 jsp Unsupported encoding:gb...
它通过删除不必要的字符,如注释、空格、换行符,以及对变量名进行混淆来实现压缩。UglifyJS 也支持 ES6 及以上版本的 JavaScript 语法。 在Java开发中,尤其是在构建Web应用程序时,Maven是一个强大的依赖管理和...
5. **设置中文支持**:为解决中文乱码问题,需要在JSP页面头部添加`;charset=UTF-8"%>`来设定字符编码。 6. **引入文件**:使用`<%@ include file="xxx.jsp"%>`可以将一个JSP文件包含到另一个JSP文件中,实现代码...
实现方法: 1. 数据库设计 2007-12-23 14:42 2. MessageVO.java 定义留言属性的一个bean文件,定义了各个字段的get和set方法。...如果又兴趣学习jsp的朋友可以下载看看,里面包航所以的源代码和实现方法。
charset=字符集类型">`定义页面编码,如`gb2312`用于简体中文,防止乱码问题。 - **定时跳转**:`跳转时间;URL=链接地址">`可实现页面自动刷新或跳转。 - **过渡效果**:`过渡事件" content="revealtrans...
在JSP页面中进行中文参数传递时,我们经常需要处理字符编码的问题,以确保数据在网络中传输或在服务器端处理时不会出现乱码。本文将探讨使用JavaScript的escape函数编码和JSP的request.getParameter方法获取参数的...
这样可以避免因编码不一致导致的中文乱码问题。 - 在`Window -> preference -> MyEclipse -> Files and Editors`中,对各类文件进行如下设置: - `ASP and PHP -> Encoding`:选择UTF-8。 - `CSS -> CSS Source`...
本文将深入探讨如何解决在IE浏览器下使用JQuery的Ajax POST提交时出现的中文乱码问题。 首先,我们需要理解问题的背景。在JQuery的Ajax POST请求中,当尝试向服务器发送包含中文字符的数据时,这些数据在Firefox和...
对于Java Server Pages (JSP) 技术来说,正确处理中文参数尤其重要,因为不正确的编码转换可能会导致乱码问题。本文将详细解释如何在JSP中正确地处理中文参数,并提供一个示例代码来帮助理解。 #### 二、基本概念与...
这可能导致解析问题,因为解析器可能会将`charset`后的空格和`gb2312`视为两个独立的属性值,而不是一个完整的字符集名称。因此,JSP引擎可能无法识别这个带有空格的字符集,从而引发`Unsupported encoding`错误。 ...
功能: 将文件(.java/.jsp/.html/.htm)中的空白行去掉 使用方法: 将deleteBlank.exe 文件放到要更新的文件夹中,双击即可 1.0.2 修改了空白格只有空格... 1.0.3 修改文件中有汉字时,处理后,汉字部分变为乱码的问题
在JavaScript中,URL编码是处理含有特殊字符,如...同时,要确保服务器和客户端使用的字符编码一致,否则仍然可能出现乱码问题。对于现代Web应用,通常推荐使用UTF-8作为统一的编码格式,以避免不必要的兼容性问题。
1. UTF-8 编码的重要性:在 WEB 开发中,UTF-8 编码扮演着非常重要的角色,特别是在传递中文时,必须经过编码的动作,否则可能会出现乱码的情况。 2. 使用 URLEncoder.encode() 方法:在 Java 中,可以使用 java...