`
zhaoyanfangeye
  • 浏览: 124859 次
  • 性别: 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]
分享到:
评论

相关推荐

    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作为统一的编码格式,以避免不必要的兼容性问题。

    如何将编码转换为UTF-8

    1. UTF-8 编码的重要性:在 WEB 开发中,UTF-8 编码扮演着非常重要的角色,特别是在传递中文时,必须经过编码的动作,否则可能会出现乱码的情况。 2. 使用 URLEncoder.encode() 方法:在 Java 中,可以使用 java...

Global site tag (gtag.js) - Google Analytics