网址:http://newspic.cn.yahoo.com/newspic/bbs/2260/遇到个麻烦:虽然根据其标定的编码方式进行了转换,但源码中的汉字还是乱码。(绝大多数yahoo网页和其它网页不存在这个问题)首先用WebClient下载byte[]数据,然后获取网页源码:
        private string BytesToString(byte[] data, out string charSet)
        {
            charSet = "";
            string sHtml = Encoding.Default.GetString(data);
            string CharSet = charSet;            Regex rg = new Regex("<meta.+?charset=(?<name>.*?)\".*?>", RegexOptions.IgnoreCase);
            Match m = rg.Match(sHtml);            if (m.Success)
            {
                CharSet = m.Groups["name"].Value;
                charSet = CharSet; 
            }            if (CharSet.Length > 0)
            {
                sHtml = Encoding.GetEncoding(CharSet).GetString(data);
            }            return sHtml;
        }        WebClient wc = new WebClient();
        byte[] _Data = wc.DownloadData("http://newspic.cn.yahoo.com/newspic/bbs/2260/");
        string _MimeType = wc.ResponseHeaders["content-type"];
        string set = "";
        string content = BytesToString(_Data,out set);
        System.IO.File.WriteAllText("C:\\html.txt", content, Encoding.GetEncoding(set));
另外一个获取网页编码的办法是WebClient属性ResponseHeaders["content-type"];两种方法得到的网页编码都是gb2312,但不清楚为啥还是乱码。求解释,求成功示例!

解决方案 »

  1.   

    请版本删除epornxx回复并封该人帐号。
      

  2.   

    WebClient wc = new WebClient();
                byte[] _Data = wc.DownloadData("http://newspic.cn.yahoo.com/newspic/bbs/2260/");
                string _MimeType = wc.ResponseHeaders["content-type"];//此处显示为utf8
                string content = Encoding.UTF8.GetString(_Data); 
                System.IO.File.WriteAllText("C:\\html.txt", content, Encoding.UTF8);
      

  3.   

    感谢楼上朋友回复,我总结一下:我开头所贴代码正是网上所流传方法,该方法对于大多数网页是适用的。不过最可靠的办法是:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Text.RegularExpressions;
    using System.Net;
    using System.Net.Cache;
    using System.Windows.Forms;namespace GetHtmlCode
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }        private void button1_Click(object sender, EventArgs e)
            {
                this.textBox1.Text = GetHtmlCode(this.textBox2.Text);
            }        public static string GetHtmlCode(string url)
            {
                WebClient wc = new WebClient();
                wc.Credentials = CredentialCache.DefaultCredentials;
                wc.Headers.Add("Accept", "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*");
                wc.Headers.Add("Accept-Language", "zh-cn");
                wc.Headers.Add("UA-CPU", "x86");
                wc.Headers.Add("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)");
                byte[] dataBuffer = wc.DownloadData(url);
                string _MimeType = wc.ResponseHeaders["content-type"];            string set = "";
                Regex reg = new Regex("charset=(?<set>[^\"\\s;]+)");
                Match m = reg.Match(_MimeType);
                if (m.Success)
                { 
                    set = m.Groups["set"].Value;
                    return Encoding.GetEncoding(set).GetString(dataBuffer);
                }
                else
                {
                    string strWebData = Encoding.Default.GetString(dataBuffer);
                    Regex rg = new Regex("<meta.+?charset=(?<name>.*?)\".*?>", RegexOptions.IgnoreCase);
                    Match m2 = rg.Match(strWebData);
                    string webCharSet = m2.Groups["name"].Value;
                    strWebData = Encoding.GetEncoding(webCharSet).GetString(dataBuffer);
                    return strWebData;
                }
            }
        }
    }