2009-03-12 12 views
2

ich zur Zeit eine HTML-Seite bin herunterladen, mit dem folgenden Code:HttpWebRequest: Empfangen Antwort mit der richtigen Codierung

Try 
    Dim req As System.Net.HttpWebRequest = DirectCast(WebRequest.Create(URL), HttpWebRequest) 
    req.Method = "GET" 
    Dim resp As Net.HttpWebResponse = DirectCast(req.GetResponse(), Net.HttpWebResponse) 
    Dim stIn As IO.StreamReader = New IO.StreamReader(resp.GetResponseStream()) 
    Dim strResponse As String = stIn.ReadToEnd 

    ''Clean up 
    stIn.Close() 
    stIn.Dispose() 
    resp.Close() 

    Return strResponse 

Catch ex As Exception 
    Return "" 
End Try 

Das funktioniert gut für die meisten Seiten, aber für einige (zB: www.gap.com), Bekomme ich die Antwort falsch codiert.
In gap.com, zum Beispiel, bekomme ich "'" als "?"
Und nicht zu erwähnen, was passiert, wenn ich versuche, google.cn zu laden ...

Was fehlt mir hier, um zu bekommen .Net dieses Recht zu kodieren?

Meine schlimmste Befürchtung ist, dass ich tatsächlich das Meta-Tag innerhalb der HTML lesen muss, die die Codierung angegeben hat, und dann den gesamten Stream erneut lesen (neu codieren?).

Alle Zeiger werden sehr geschätzt.


UPDATE:

Dank John Saunders' Antwort, ich bin ein bisschen näher. Die Eigenschaft HttpWebResponse.ContentEncoding scheint immer leer zu sein. Allerdings HttpWebResponse.CharacterSet scheint nützlich, und mit diesem Code, ich bin immer näher:

Dim resp As Net.HttpWebResponse = DirectCast(req.GetResponse(), Net.HttpWebResponse) 
Dim respEncoding As Encoding = Encoding.GetEncoding(resp.CharacterSet) 
Dim stIn As IO.StreamReader = New IO.StreamReader(resp.GetResponseStream(), respEncoding) 

Jetzt Google.cn perfekt kommt, mit all den chinesischen Schriftzeichen.
Allerdings kommt Gap.Com immer noch falsch.

Für Gap.com, HttpWebResponse.CharacterSet ist ISO-8859-1, die Codierung Ich bin durch GetEncoding ist {System.Text.Latin1Encoding}, die sagt "ISO-8859-1" in seinem Namen ist, UND das META-Tag "Content-Type" im HTML-Code "charset = ISO-8859-1".

Mache ich immer noch etwas falsch?
Oder macht GAP etwas falsch?

Antwort

1

Die Website von Gap ist falsch. Das spezifische Problem ist, dass ihre Seite eine Codierung von Latin1 (ISO-8859-1) beansprucht, während die Seite das Zeichen # 146 verwendet, das in ISO-8859-1 nicht gültig ist.

Dieses Zeichen ist jedoch in der Windows-CP-1252-Codierung (die eine Obermenge von ISO 8859-1 ist) gültig. In CP-1252 wird der Zeichencode # 146 und für das Anführungszeichen verwendet. Du wirst dies als einen Apostroph in "Du wirst Petites und kleine Größen finden" im heutigen Text auf der Gap.com-Homepage sehen.

Sie können http://en.wikipedia.org/wiki/Windows-1252 für weitere Details lesen. Stellt sich heraus, diese Art von Sache ist ein häufiges Problem auf Webseiten, wo der Inhalt ursprünglich in der CP-1252-Codierung (z. B. Kopieren/Einfügen von Word) gespeichert wurde.

Moral der Geschichte hier: Speichern Sie immer internationalisierten Text als Unicode in Ihrer Datenbank und geben Sie HTML immer als UTF8 auf Ihrem Webserver aus!

2

Ich glaube, dass die HttpWebResponse eine ContentEncoding -Eigenschaft hat. Verwenden Sie es im Konstruktor Ihres StreamReaders.

0

Daniel, Einige Seiten geben nicht einmal einen Wert in der CharacterSet zurück, so dass dieser Ansatz nicht so zuverlässig ist. Manchmal sind nicht einmal die Browser in der Lage zu "raten" welches Encoding zu verwenden ist, also denke ich, dass du keine 100% Encoding-Erkennung machen kannst.

In meinem speziellen Fall, wie ich mit spanischen oder portugiesischen Seiten, verwende ich die UTF7 Codierung und es funktioniert gut für mich (áéíóúññêê ... etc).

Möglicherweise können Sie zuerst eine Tabelle mit Zeichensatzcodes und der entsprechenden Codierung laden. Und falls das CharacterSet leer ist, können Sie eine Standardcodierung angeben.

Der detectEncodingFromByteOrderMarks Parameter im StreamReader Konstruktor, kann ein wenig helfen, da es automatisch erkennt oder einige Codierungen von den allerersten Bytes ableitet.

Verwandte Themen