设置Accept-Encoding为gzip,deflate,返回的网页是乱码

时间:2024-02-18 12:18:02

用C#写代码去获取网页内容。

其中request的header中,设置Accept-Encoding为gzip,deflate:

req = (HttpWebRequest)WebRequest.Create(gSkydriveUrl);

req.Headers.Add("Accept-Encoding", "gzip,deflate");

结果始终返回是乱码:

其中,此处之所以加此header,是因为看到网页分析工具中所得到的浏览器浏览该网页,对应的http的header的内容中,就是这样设置的。

所以,代码中,也是模拟浏览器去访问网页,就设置了对应的Accept-Encoding为gzip,deflate了。

【解决过程】

1.刚开始以为是编码的问题,所以去尝试了不同的编码:

req.Headers["Accept-Charset"] = "GBK,utf-8;q=0.7,*;q=0.3";

req.Headers["Accept-Charset"] = "utf-8";

结果始终无法解决问题。

2.后来无意间,把Accept-Encoding取消了,没有设置为gzip,deflate:

//req.Headers.Add("Accept-Encoding", "gzip,deflate");

结果,获得的网页,就正常了。

3.后来网上找到了具体的解释,那就是,

普通浏览器访问网页,之所以添加:

"Accept-Encoding" = "gzip,deflate"

那是因为,浏览器对于从服务器中返回的对应的gzip压缩的网页,会自动解压缩,所以,其request的时候,添加对应的头,表明自己接受压缩后的数据。

而此代码中,如果也添加此头信息,结果就是,返回的压缩后的数据,没有解码,而将压缩后的数据当做普通的html文本来处理,当前显示出来的内容,是乱码了。

【后记 2012-02-14】

后来调试过程中,突然发现,原来对于HttpWebRequest的参数设置中,还有一个选项是AutomaticDecompression,对于新创建的HttpWebRequest:

HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);

其默认值是None,然后去试了试,该设置为Gzip,然后同时Accept-Encoding为对应的gzip:

req.Headers["Accept-Encoding"] = "gzip,deflate"; 
req.AutomaticDecompression = DecompressionMethods.GZip;

结果证明,这样也是可以获得对应的格式正确的数据,而不是乱码的。

这就意味着,如果你获取网页内容太大的话,那么还是可以用这个办法的,这样就可以让HttpWebRequest自动帮你实现对应的解压缩了,可以减少数据数据传输量,节省时间,提高效率。

需要注意的是,我这里的实测结果,如果是请求的网页返回的内容不多的话,比如只有几K,那么用了此自动解压缩的设置,也没啥效率的提高,因为毕竟自动解压,也是要花时间的。所以,就是个权衡问题了。自己以实测结果为准,觉得是否采用自动解压。

【总结】

想要获得正确网页内容,而非乱码的话,就有两种方式了:

1.不要设置Accept-Encoding的Header

//req.Headers.Add("Accept-Encoding", "gzip,deflate");

2.设置Accept-Encoding的Header,同时设置对应的自动解压缩的模式

req.Headers["Accept-Encoding"] = "gzip,deflate"; 
req.AutomaticDecompression = DecompressionMethods.GZip;

具体采用哪种方法,自己根据需要选择。