因采集需求,想解決網頁編碼識別問題。網上提出了很多方法。比如根據文件頭字節判斷,或根據網頁的charset標識符判斷。
我在實際應用中,這些方法都有各自的不足,比如有的網頁charset寫的是gbk,但實際是utf8。
於是想了一個個人認為比較新鮮的方法。將html下載回來后,做一份utf8副本和一份gbk副本,然后將utf8轉換為bytes,判斷bytes內是否有亂碼標識(連續三個byte表示為239 191 189),如果有,則表示為亂碼,直接使用gbk,如果沒有,則表示沒有亂碼,直接使用utf8。
下面看看我的代碼:
獲取html
var data = new System.Net.WebClient { }.DownloadData(this.textBox1.Text); //根據textBox1的網址下載html var r_utf8 = new System.IO.StreamReader(new System.IO.MemoryStream(data),Encoding.UTF8); //將html放到utf8編碼的StreamReader內 var r_gbk = new System.IO.StreamReader(new System.IO.MemoryStream(data), Encoding.Default); //將html放到gbk編碼的StreamReader內 var t_utf8 = r_utf8.ReadToEnd(); //讀出html內容 var t_gbk = r_gbk.ReadToEnd(); //讀出html內容 if (!isLuan(t_utf8)) //判斷utf8是否有亂碼 { htm = t_utf8; this.Text = "utf8"; } else { htm = t_gbk; this.Text = "gbk"; } this.textBox2.Text = htm;
判斷是否有亂碼
bool isLuan(string txt) { var bytes = Encoding.UTF8.GetBytes(txt); //239 191 189 for (var i = 0; i < bytes.Length; i++) { if(i < bytes.Length - 3) if (bytes[i] == 239 && bytes[i + 1] == 191 && bytes[i + 2] == 189) { return true; } } return false; }
雕蟲小技,在此獻丑了!暫時沒發現問題,歡迎大家測試反饋!謝謝!