写一个aps.net 的模拟蜘蛛程序,简单流程搞定了,最关键的 网页编码判断上,
utf -8gb2312bgk。用这种方案,不行
  static string GetHtml(string url, Encoding encoding)
  {
    byte[] buf = new WebClient().DownloadData(url);
    if (encoding != null) return encoding.GetString(buf);
    string html = Encoding.UTF8.GetString(buf);
    encoding = GetEncoding(html);
    if (encoding == null || encoding == Encoding.UTF8) return html;
    return encoding.GetString(buf);
  }
只能区分 utf8 与 非utf8 被否定,而且 encoding 不支持中文的gbk 怎么办?

解决方案 »

  1.   

    encoding.getecoding(936)
    encoding.default
      

  2.   

    难道要让我自己写个 encoding 派生类?
      

  3.   

    public static string GetEncoding(string url)
            {
                HttpWebRequest request = null;
                HttpWebResponse response = null;
                StreamReader reader = null;
                try
                {
                    request = (HttpWebRequest)WebRequest.Create(url);
                    request.Timeout = 20000;
                    request.AllowAutoRedirect = false;                response = (HttpWebResponse)request.GetResponse();
                    if (response.StatusCode == HttpStatusCode.OK && response.ContentLength < 1024 * 1024)
                    {
                        if (response.ContentEncoding != null && response.ContentEncoding.Equals("gzip", StringComparison.InvariantCultureIgnoreCase))
                            reader = new StreamReader(new GZipStream(response.GetResponseStream(), CompressionMode.Decompress));
                        else
                            reader = new StreamReader(response.GetResponseStream(), Encoding.ASCII);                    string html = reader.ReadToEnd();                    Regex reg_charset = new Regex(@"charset\b\s*=\s*(?<charset>[^""]*)");
                        if (reg_charset.IsMatch(html))
                        {
                            return reg_charset.Match(html).Groups["charset"].Value;
                        }
                        else if (response.CharacterSet != string.Empty)
                        {
                            return response.CharacterSet;
                        }
                        else
                            return Encoding.Default.BodyName;
                    }
                }
                catch
                {
                }
                finally
                {                if (response != null)
                    {
                        response.Close();
                        response = null;
                    }
                    if (reader != null)
                        reader.Close();                if (request != null)
                        request = null;            }            return Encoding.Default.BodyName;
            }