根据读取的文件头字节判断,或根据网页的charset标识符判断、
然后再设置GetEncoding("gb2312"))为什么

解决方案 »

  1.   

    问题是GB2312有时可以,有时不行,而Unicode、UTF-8等都不行,试着用webResponse.CharacterSet,取到的编码为:iso-8859-1,但是这个打开的网页还是乱码,求教
      

  2.   


    人家服务器没有发送编码就弄个默认值iso-8859-1。
    很有可能网页是经过压缩了。
    你搜索一下网页压缩 gzip。
    解压缩以后才能用正确的编码得到html字符串。
      

  3.   

    public static string GetEncoding(string Url)
            {
                try
                {
                    HttpWebRequest myHttpWebRequest = (HttpWebRequest)HttpWebRequest.Create(Url);
                    myHttpWebRequest.AllowAutoRedirect = false;
                    HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
                    myHttpWebResponse.Close();
                    return Regex.Match(myHttpWebResponse.Headers.Get("Content-Type"), @"(?is)(?<=char\-?set[:=])\S+").Value;
                }
                catch { return ""; }
            }
      

  4.   

    using (HttpWebResponse response = (HttpWebResponse)webrequest.GetResponse())
                    {                    if (response.ContentEncoding.ToLower().Contains("gzip"))
                        {
                            using (GZipStream stream = new GZipStream(response.GetResponseStream(), CompressionMode.Decompress))
                            {
                                using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
                                {                                model.html = reader.ReadToEnd();
                                }
                            }
                        }
                        else if (response.ContentEncoding.ToLower().Contains("deflate"))
                        {
                            using (DeflateStream stream = new DeflateStream(response.GetResponseStream(), CompressionMode.Decompress))
                            {
                                using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
                                {                                model.html = reader.ReadToEnd();
                                }                        }
                        }
                        else
                        {
                            using (Stream stream = response.GetResponseStream())
                            {
                                using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
                                {                                model.html = reader.ReadToEnd();
                                }
                            }
                        }
                    }
      

  5.   

    用浏览器访问下对方网站,抓包看看对方用的什么编码
    gzip是浏览器发送支持gzip标志才返回gzip压缩数据,模拟发送的时候不要发送gzip标志,或者发送后回来解压缩也好
      

  6.   

        14楼正解,十分感谢大家,我跟踪了代码,时而进入第一个if,时而进入else,说明这个网页时而压缩,时而不压缩,网页是http://www.okooo.com/jingcai/,大家有兴趣可以抓取看看是不是这么回事。
        另外我是用正则匹配得到网页数据的,有时候网页源码的编码一旦变了,就得修改正则表达式,这个不利于后期代码维护,所以想问问除了正则,还有没有什么可靠地办法来稳定的获取网页数据?欢迎大家探讨。
      

  7.   

    试试HtmlAgilityPack,解析html不一定非要用正则
      

  8.   

    hjywyj说的我刚才上网搜了一下,貌似很好用,我再研究下,你的方法很好,我的分不多,给你和yonglaixiazaide一点意思一下,同时也十分感谢大家,谢谢。
      

  9.   

    http://www.86y.org/art_detail.aspx?id=722 用了14楼的方法然后自己再引用了一下。希望能给大家带来帮助