最近在做一個項目,其中一個功能是根據一個URL位址,取得到網頁的原始碼。在ASP.NET(C#)中,取得網頁原始碼看起來有很多種方法,我隨便搞了一個簡單的WebClient,非常簡單又容易。但後面一個很惱人的問題出來了,那就是中文的亂碼。
透過仔細研究,中文的網頁不外乎GB2312和UTF-8這兩種編碼。於是有了下面這段程式碼:
/// <summary> /// 根据网址的URL,获取源代码HTML /// </summary> /// <param name="url"></param> /// <returns></returns> public static string GetHtmlByUrl(string url) { using (WebClient wc = new WebClient()) { try { wc.UseDefaultCredentials = true; wc.Proxy = new WebProxy(); wc.Proxy.Credentials = CredentialCache.DefaultCredentials; wc.Credentials = System.Net.CredentialCache.DefaultCredentials; byte[] bt = wc.DownloadData(url); string txt = System.Text.Encoding.GetEncoding("GB2312").GetString(bt); switch (GetCharset(txt).ToUpper()) { case "UTF-8": txt = System.Text.Encoding.UTF8.GetString(bt); break; case "UNICODE": txt = System.Text.Encoding.Unicode.GetString(bt); break; default: break; } return txt; } catch (Exception ex) { return null; } } }
稍微解釋一下,這裡使用了WebClient創建了一個wc物件(這命名有點尷尬了)。然後呼叫wc物件的DownloadData方法,傳入URL值,傳回一個位元組數組。預設使用GB2312來讀取這個位元組數組,把它轉換成字串。從網頁原始碼的字串中尋找網頁的編碼格式的特徵字符,如找到charset="utf-8"這樣的訊息,來判斷目前網頁的編碼格式。
GetCharset這個函數就是來取得目前網頁的編碼格式的,具體程式碼如下:
/// <summary> /// 从HTML中获取获取charset /// </summary> /// <param name="html"></param> /// <returns></returns> public static string GetCharset(string html) { string charset = ""; Regex regCharset = new Regex(@"content=[""'].*\s*charset\b\s*=\s*""?(?<charset>[^""']*)", RegexOptions.IgnoreCase); if (regCharset.IsMatch(html)) { charset = regCharset.Match(html).Groups["charset"].Value; } if (charset.Equals("")) { regCharset = new Regex(@"<\s*meta\s*charset\s*=\s*[""']?(?<charset>[^""']*)", RegexOptions.IgnoreCase); if (regCharset.IsMatch(html)) { charset = regCharset.Match(html).Groups["charset"].Value; } } return charset; }
更多使用C#取得網頁HTML原始碼的範例相關文章請關注PHP中文網!