c# 獲取網頁源碼,自動判斷編碼格式新方法!


因采集需求,想解決網頁編碼識別問題。網上提出了很多方法。比如根據文件頭字節判斷,或根據網頁的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;
        }

雕蟲小技,在此獻丑了!暫時沒發現問題,歡迎大家測試反饋!謝謝!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM