首页 新闻 赞助 找找看

下载文件乱码的问题?

0
悬赏园豆:10 [已解决问题] 解决于 2013-11-21 10:35

我使用HttpWebRequest下载百度网盘里的文件,可以获取到Content-Disposition, 然后获取文件名,有以下三种情况:

1.全英文没问题。

2.全中文有时没问题,有时文件名还是乱码。

3.文件名中英文混合的会有问题,获取到的文件名中亠部分乱码.

代码如下:

var url = state.ToString();
                HttpWebRequest request = null;
                if (url.ToLower().StartsWith("https", StringComparison.OrdinalIgnoreCase))
                {
                    ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(CheckValidationResult);
                    request = WebRequest.Create(url) as HttpWebRequest;
                    request.ProtocolVersion = HttpVersion.Version10;
                }
                else
                {
                    request = WebRequest.Create(url) as HttpWebRequest;
                }

                request.AllowWriteStreamBuffering = true;
                request.Credentials = System.Net.CredentialCache.DefaultCredentials;
                request.Proxy = new WebProxy { UseDefaultCredentials = true };
                request.MaximumResponseHeadersLength = -1;
                request.AllowAutoRedirect = false;
                request.UserAgent = "TLE Retriever v1.5.8";
                request.ContentType = "application/x-www-form-urlencoded";
                request.Method = "GET";
                request.Headers.Add("Accept-Language", "zh-cn");
                request.Headers.Add("Accept-Encoding", "gzip,deflate");
                request.KeepAlive = true;
                if (request == null)
                    return;

                var response = request.GetResponse();
                request.Abort();

                var filename = response.Headers["Content-Disposition"];
                if (string.IsNullOrWhiteSpace(filename))
                    return;

                var pos = filename.ToLower().IndexOf("filename=");
                if (pos <= 0 || pos > filename.Length - 1)
                    return;

                filename = filename.Substring(pos + "filename=".Length);
                filename = HttpUtility.UrlDecode(filename);

直到最后一句代码,获取工作已经完成,但获取的文件名是乱码,而FF和IE中显示正常,谁能给个帮助?

问题补充:

google了一圈,msdn中能看懂的文字都查了遍,都在说服务端怎么返回,几乎没人讨论客户端怎么下载的,只能等待高人了。

空明流光的主页 空明流光 | 初学一级 | 园豆:106
提问于:2013-11-20 18:08
< >
分享
最佳答案
0

在MSDN上找到答案了,是使用的是一个以ISO开头的编码先解码,然后再根据Charset判断再解码,但好像还不是很完美,有个别文件解出来多出一个B010的字符串前缀。IE显示正常,但我发现FF里显示的也有这个前缀,怎么改编码方式都没用。这样就可以了,起码比迅雷强,迅雷直接显示乱码。

空明流光 | 初学一级 |园豆:106 | 2013-11-21 10:20

恭喜让我长姿势了~

Zery | 园豆:6151 (大侠五级) | 2013-11-21 10:37
其他回答(4)
0

把request.Headers.Add("Accept-Encoding", "gzip,deflate");这句去掉

这个问题我也遇到过

收获园豆:1
Zery | 园豆:6151 (大侠五级) | 2013-11-20 18:10

不对,尽管我觉得不用试,但我还是试了下,依然不行

那句header是压缩的,但对于文件名是没有影响的,传输过程中是压缩的,到客户端后会被自动解压。

支持(0) 反对(0) 空明流光 | 园豆:106 (初学一级) | 2013-11-20 18:58
0

拿TXT另存为,字符编码改为UTF8

收获园豆:1
yuankess | 园豆:252 (菜鸟二级) | 2013-11-20 18:29

大哥,这个方法我就不试了

支持(0) 反对(0) 空明流光 | 园豆:106 (初学一级) | 2013-11-20 18:59

@沧海一杰: 。。。。。

支持(0) 反对(0) yuankess | 园豆:252 (菜鸟二级) | 2013-11-22 17:20
0

HttpUtility.UrlDecode要一个编码参数的,用response里返回的编码(哪个属性时间长了记不清了)。 

收获园豆:4
Todd Pointer | 园豆:379 (菜鸟二级) | 2013-11-21 00:10
0

首先你需要确定返回的 Content-Disposition 使用的是什么编码,注意这同 Body 的编码是不同的。

然后你需要读取 Content-Disposition 的字节流值,然后在转换成 unicode 的 string.

收获园豆:4
Launcher | 园豆:45045 (高人七级) | 2013-11-21 10:18
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册