2013-10-14 19 views
0

我即將下載以UTF-8編碼的page。 所以這是我的代碼:爲什麼UTF-8在編碼上失敗?

using (WebClient client = new WebClient()) 
{ 
    client.Headers.Add("user-agent", Request.UserAgent); 

    htmlPage = client.DownloadString(HttpUtility.UrlDecode(resoruce_url)); 

    var KeysParsed = HttpUtility.ParseQueryString(client.ResponseHeaders["Content-Type"].Replace(" ", "").Replace(";", "&")); 
    var charset = ((KeysParsed["charset"] != null) ? KeysParsed["charset"] : "UTF-8"); 
    Response.Write(client.ResponseHeaders); 

    byte[] bytePage = Encoding.GetEncoding(charset).GetBytes(htmlPage); 
    using (var reader = new StreamReader(new MemoryStream(bytePage), Encoding.GetEncoding(charset))) 
    { 
     htmlPage = reader.ReadToEnd(); 
     Response.Write(htmlPage); 
    } 
} 

所以,它的編碼設置UTF-8。但下載的標題,例如,展現在我的屏幕爲:

Sexy cover: 60 e più di 「quei dischi」 vietati ai minori 

而不是:

Sexy cover: 60 e più di 「quei dischi」 vietati ai minori 

出頭是錯的,但我沒有找到地方。有任何想法嗎?

+0

如果您使用網絡瀏覽器,它會說什麼? – Gusdor

+0

使用網絡瀏覽器,標題上的正確文字是「性感封面:60 epiùdi」quei dischi「vietati ai minori'。試試看,用Firefox打開它:) – markzzz

+1

「性感的封面」。先生,我在工作。試試UTF-16和ASCII西歐,看看它說什麼。你確定你應該默認UTF-8嗎? – Gusdor

回答

5

問題是,當你得到的數據已經被轉換。

WebClient.DownloadString執行時,它獲取原始字節並使用默認編碼將它們轉換爲字符串。損害已經完成。你不能把結果字符串,把它變回字節,並重新解釋它。

換句話說,這是發生了什麼事:

// WebClient.DownloadString does, essentially, this. 
byte[] rawBytes = DownloadData(); 
string htmlPage = Encoding.Default.GetString(rawBytes); 

// Now you're doing this: 
byte[] myBytes = Encoding.Utf8.GetBytes(htmlPage); 

myBytes不一定是相同的rawBytes

如果您事先知道使用哪種編碼,則可以設置WebClient實例的Encoding屬性。如果您想根據Content-Type標頭中指定的編碼解釋字符串,則必須下載原始字節,確定編碼並使用它來解釋字符串。例如:

var rawBytes = client.DownloadData(HttpUtility.UrlDecode(resoruce_url)); 
var KeysParsed = HttpUtility.ParseQueryString(client.ResponseHeaders["Content-Type"].Replace(" ", "").Replace(";", "&")); 
var charset = ((KeysParsed["charset"] != null) ? KeysParsed["charset"] : "UTF-8"); 

var theEncoding = Encoding.GetEncoding(charset); 
htmlPage = theEncoding.GetString(rawBytes); 
+0

啊,有'GetString()',所以我根本不需要GetBytes!謝謝! – markzzz