如何解决IE下载时中文文件名变乱码的问题

问题现象

当我们使用IE浏览器下载中文文件名的文件时,先弹出“文件下载”对话框如下:

 

如果你点击“保存”的话,没有任何问题。但是如果你点击“打开”按钮的话,你会发现文件名变成了一串乱码,见下图

 

背景

文件下载功能所对应的服务端ASP.NET代码如下:

        String value = "test";

        Response.Clear();

        Response.ClearHeaders();

        Response.Buffer = false;

        Response.ContentType = "application/octet-stream";

        Response.ContentEncoding = System.Text.Encoding.UTF8;

        String filename = HttpUtility.UrlEncode("中文.txt", System.Text.Encoding.UTF8);    //对中文文件名进行HTML转码

        Response.AddHeader("CONTENT-LENGTH", value.Length.ToString());

        Response.AddHeader("Content-Disposition", "attachment; filename=" + filename);

         Response.CacheControl = "public";

         Response.Write(value);

        Response.Flush();

        Response.End();

 

环境

实际上此问题只在IE6、IE7的环境下发生,IE8以上版本没有问题

 

问题起因

如果你通过Fiddler之类的工具来抓取HTTP包的话,可以看到服务器段发回来的Response Header如下。

HTTP/1.1 200 OK
Server: ASP.NET Development Server/9.0.0.0
Date: Sun, 09 Oct 2011 07:32:12 GMT
X-AspNet-Version: 2.0.50727
Content-Length: 4
Content-Disposition: attachment; filename=%e4%b8%ad%e6%96%87.txt
Cache-Control: public
Content-Type: application/octet-stream
Connection: Close

 实际上文件名是由Content-Disposition头里面的filename信息来决定的,这是一串经过URLEncode之后的UTF-8码,并不是乱码,它所对应的文字信息正是”中文”两个字。对于IE6、IE7来讲,在弹出“文件下载”对话框的时候IE浏览器实际上已经把文件保存在临时目录,而文件名并没有做转码,所以在临时目录里面的文件名就是 %e4%b8%ad%e6%96%87[1].txt

如果你点击“保存”按钮的话,依然是由IE浏览器在处理保存文件的工作,所以它会自动转码;而当你点击“打开”按钮的时候,IE浏览器只是负责通知相应的应用程序来打开临时目录里的文件,所以我们就看到了文件名在记事本里面显示为乱码的现象。

 

解决办法

我们所推荐的方式是升级到IE8或者以上版本。 如果不升级,针对IE6没有任何办法,针对IE7可以采取以下方法。

1)    下载最新的IE累积补丁。可以先访问https://technet.microsoft.com/en-us/cc264855.aspx找到所有的最新安全补丁。

注意:请访问英文网站,因为中文网站有时候可能没有及时更新

从列表里面找到Cumulative Security Update for Internet Explorer,如下图

进入相关链接(在此时最新的IE补丁是Microsoft Security Bulletin MS11-057),找到你的操作系统所对应的版本,比如我XP SP3的机器所下载的就是IE7-WindowsXP-KB2559049-x86-ENU.exe

2)      用以下命令来打补丁
IE7-WindowsXP-KB2559049-x86-ENU.exe /b:sp3qfe
注意:由于我的是XP SP3,所以/b后面对应的是sp3qfe;如果你是SP2的机器,就要用sp2qfe

3)     打完补丁添加以下注册表键值
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_ALLOW_LONG_INTERNATIONAL_FILENAMES]
"iexplore.exe"=dword:00000001

4)      重起机器再测试

 

Zhixing From APGC DSI Team