2011-12-26 39 views
2

我需要下載一個網頁獲取網頁,我有以下代碼determe編碼編碼時,從網

   System.IO.StreamReader sr=null; 

       mFrm.InfoShotcut("Henter webside...."); 
       if(response.ContentEncoding!=null && response.ContentEncoding!="") 
       { 
        sr=new System.IO.StreamReader(srm,System.Text.Encoding.GetEncoding(response.ContentEncoding)); 
       } 
       else 
       { 
        //System.Windows.Forms.MessageBox.Show(); 
        sr=new System.IO.StreamReader(srm,System.Text.Encoding.GetEncoding(response.CharacterSet)); 
       } 

       if(sr!=null) 
       { 
        result=sr.ReadToEnd(); 

        if(response.CharacterSet!=GetCharatset(result)) 
        { 
         System.Text.Encoding CorrectEncoding=System.Text.Encoding.GetEncoding(GetCharatset(result)); 

         HttpWebRequest client2=(HttpWebRequest)HttpWebRequest.Create(Helper.value1); 

         HttpWebResponse response2=(HttpWebResponse)client2.GetResponse(); 

         System.IO.Stream srm2=response2.GetResponseStream(); 

         sr=new System.IO.StreamReader(srm2,CorrectEncoding); 

         result=sr.ReadToEnd(); 
        } 
       } 

       mFrm.InfoShotcut("Henter webside......"); 
      } 
      catch (Exception ex) 
      { 
       // handle error 
       MessageBox.Show(ex.Message); 
      } 

,它有偉大的工作,但現在我有一個網站,它試了一下指出它採用

<pre> 
&lt;META http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> 
</pre> 

但真的是UTF-8,我怎麼發現,母豬我可以將文件保存與正確的編碼。

+0

有一個這樣的網站lof。你必須找到一種方法來猜測編碼。 – 2011-12-26 22:58:42

回答

1

首先,Content-Encoding標頭沒有描述正在使用的字符集。作爲RFC說:

內容編碼是主要用於允許文件被壓縮或而不丟失而不會丟失信息其底層的媒體類型和身份否則有效轉化。

使用的字符集描述在Content-Type標題中。例如:

Content-Type: text/html; charset=UTF-8 

你上面的代碼使用了Content-Encoding頭將不能正確識別的字符集。您必須查看Content-Type標題,找到分號(如果存在),然後解析charset參數。

而且,正如您發現的那樣,它也可以用HTML META標籤來描述。

或者,可能根本沒有字符集定義,在這種情況下,您必須默認爲某種東西。我的經驗是,默認UTF-8是一個不錯的選擇。這不是100%可靠的,但似乎沒有包含參數charsetContent-Type字段通常的網站默認爲UTF-8。我還發現,META標籤存在時幾乎有一半是錯誤的。

正如L.B在他的評論中提到的,可以下載字節並檢查它們以確定編碼。這可以以令人驚訝的程度完成,但它需要大量的代碼。