如何解决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