`
zhaoyanfangeye
  • 浏览: 125690 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

jsp 下载出现乱码和空格问题

阅读更多
关于中文文件下载的问题,网上的咨询和答疑已经很多,我原来处理下载的代码如下:
   
    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]
分享到:
评论

相关推荐

    java aspose word 上传到服务器 导出的word 中文字体乱码 的问题 java aspose

    java aspose word 上传到服务器 导出的word 中文字体乱码 的问题 java aspose java aspose word 上传到服务器 导出的word 中文字体乱码 的问题 java aspose java aspose word 上传到服务器 导出的word 中文字体乱码 ...

    ajax中文乱码如何解决

    在本文中,我们将深入探讨如何解决使用Ajax进行POST请求时出现的中文乱码问题。首先,我们要理解Ajax中文乱码的根源,它通常涉及到字符编码的不一致,尤其是在客户端与服务器之间的通信过程中。 Ajax(Asynchronous...

    jspSmartUpload上传下载全攻略

    此外,对于中文文件名的支持也是一个重要的方面,通过适当的方法可以确保文件名在下载过程中不会出现乱码问题。希望这些知识点能够帮助开发者更好地掌握JSPSmartUpload的使用技巧,提高开发效率。

    web开发中url乱码处理

    8. **注意事项**:确保在整个Web应用程序中保持编码的一致性,包括数据库连接、文件读写、响应输出等环节,都应使用相同的字符编码,以避免出现乱码问题。 总之,解决URL乱码问题需要理解URL编码机制,正确设置页面...

    jsp中页面间传汉字参数转码的方法.docx

    在JavaServer Pages (JSP) 开发中,页面间的参数传递是常见的操作,尤其是在处理包含汉字的参数时,由于编码问题可能会导致乱码。本文主要介绍如何在JSP中正确地进行汉字参数的转码与解码,确保数据在页面间传递时...

    Ajax使用POST提交中文乱码问题.docx

    对于POST提交的中文乱码问题,解决方案通常涉及到前端的编码和后端的解码: 1. **前端编码**: - 在JavaScript中,使用`encodeURI`或`encodeURIComponent`函数将包含中文的字符串进行编码。需要注意的是,对于POST...

    jsp中文显示问号问题解决方法

    7. **文件流处理**:在处理文件上传或下载时,注意文件流的编码设置,避免在读写过程中出现乱码。 8. **其他编码相关问题**:除了JSP页面,还需要检查CSS、JavaScript和其他静态资源文件的编码设置,确保它们与页面...

    jsp Unsupported encoding- gb2312 错误原因.docx

    需要注意的是,gb2312 编码只能正确地显示简体中文字符,对于繁体中文字符可能会出现乱码。因此,如果您的 JSP 页面需要显示繁体中文字符,需要使用其他编码标准,例如 Big5 编码。 jsp Unsupported encoding:gb...

    UglifyJS压缩js文件和jsp里面的js代码

    它通过删除不必要的字符,如注释、空格、换行符,以及对变量名进行混淆来实现压缩。UglifyJS 也支持 ES6 及以上版本的 JavaScript 语法。 在Java开发中,尤其是在构建Web应用程序时,Maven是一个强大的依赖管理和...

    JAVA-JSP学习笔记.doc

    5. **设置中文支持**:为解决中文乱码问题,需要在JSP页面头部添加`;charset=UTF-8"%>`来设定字符编码。 6. **引入文件**:使用`<%@ include file="xxx.jsp"%>`可以将一个JSP文件包含到另一个JSP文件中,实现代码...

    简单的JSP+JAVABEAN+ACCESS留言簿

    实现方法: 1. 数据库设计 2007-12-23 14:42 2. MessageVO.java 定义留言属性的一个bean文件,定义了各个字段的get和set方法。...如果又兴趣学习jsp的朋友可以下载看看,里面包航所以的源代码和实现方法。

    JSP应用笔记总结——我的笔记

    charset=字符集类型">`定义页面编码,如`gb2312`用于简体中文,防止乱码问题。 - **定时跳转**:`跳转时间;URL=链接地址">`可实现页面自动刷新或跳转。 - **过渡效果**:`过渡事件" content="revealtrans...

    JSP页面中文传递参数使用escape编码

    在JSP页面中进行中文参数传递时,我们经常需要处理字符编码的问题,以确保数据在网络中传输或在服务器端处理时不会出现乱码。本文将探讨使用JavaScript的escape函数编码和JSP的request.getParameter方法获取参数的...

    eclipse,myeclipse 设置,编码,tab用空格代替 做专业开发人员

    这样可以避免因编码不一致导致的中文乱码问题。 - 在`Window -> preference -> MyEclipse -> Files and Editors`中,对各类文件进行如下设置: - `ASP and PHP -> Encoding`:选择UTF-8。 - `CSS -> CSS Source`...

    JQuery中Ajax的Post提交在IE下中文乱码的解决方法

    本文将深入探讨如何解决在IE浏览器下使用JQuery的Ajax POST提交时出现的中文乱码问题。 首先,我们需要理解问题的背景。在JQuery的Ajax POST请求中,当尝试向服务器发送包含中文字符的数据时,这些数据在Firefox和...

    JSP 传递中文参数的例子

    对于Java Server Pages (JSP) 技术来说,正确处理中文参数尤其重要,因为不正确的编码转换可能会导致乱码问题。本文将详细解释如何在JSP中正确地处理中文参数,并提供一个示例代码来帮助理解。 #### 二、基本概念与...

    jsp Unsupported encoding: gb2312 错误原因

    这可能导致解析问题,因为解析器可能会将`charset`后的空格和`gb2312`视为两个独立的属性值,而不是一个完整的字符集名称。因此,JSP引擎可能无法识别这个带有空格的字符集,从而引发`Unsupported encoding`错误。 ...

    去掉代码空白行

    功能: 将文件(.java/.jsp/.html/.htm)中的空白行去掉 使用方法: 将deleteBlank.exe 文件放到要更新的文件夹中,双击即可 1.0.2 修改了空白格只有空格... 1.0.3 修改文件中有汉字时,处理后,汉字部分变为乱码的问题

    js url传值中文乱码之解决之道

    在JavaScript中,URL编码是处理含有特殊字符,如...同时,要确保服务器和客户端使用的字符编码一致,否则仍然可能出现乱码问题。对于现代Web应用,通常推荐使用UTF-8作为统一的编码格式,以避免不必要的兼容性问题。

Global site tag (gtag.js) - Google Analytics