Frage

ich zur Zeit das Herunterladen einer HTML-Seite, mit dem folgenden Code:

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), habe ich die Antwort falsch codiert bekommen
. In gap.com zum Beispiel bekomme ich „‘“als‚?‘
Und nicht zu vergessen, was passiert, wenn ich versuche, google.cn zu laden ...

Was bin ich hier fehlt .Net zu bekommen, dieses Recht zu kodieren?

Meine größte Angst ist, dass ich muß tatsächlich den Meta-Tag in der HTML lesen, die die Kodierung angegeben, und dann wieder lesen (neu kodieren?), Um den ganzen Strom.

wird Alle Zeiger sehr geschätzt.


UPDATE:

Dank John Saunders' Antwort, ich bin ein bisschen näher. Die HttpWebResponse.ContentEncoding Eigenschaft scheint immer in leeren zu kommen. 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 kommt Google.cn in perfekt mit allen chinesischen Schriftzeichen.
Allerdings ist Gap.Com noch falsch kommen.

Für Gap.com, HttpWebResponse.CharacterSet ist ISO-8859-1, das Encoding ich bin durch GetEncoding bekommen ist {System.Text.Latin1Encoding}, die "ISO-8859-1" in seinen Körper Name schon sagt, UND der Content-Type META-Tag im HTML-specified "charset = ISO-8859-1".

Bin ich noch etwas falsch machen?
Oder tut GAP etwas falsch gemacht?

War es hilfreich?

Lösung

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

Das Zeichen ist jedoch gültig in der Windows-CP-1252-Codierung (das ist ein Superset von ISO 8859-1). In CP-1252, Zeichencode # 146 und für das rechte Anführungszeichen verwendet. Sie werden dies als Apostroph in „Youll finden Petites und kleinen Größen“ im Text der heute sehen auf der Gap.com Homepage.

Sie können lesen http://en.wikipedia.org/wiki/Windows-1252 für weitere Details. Stellt sich diese Art der Sache heraus ist ein weit verbreitetes Problem auf Web-Seiten, auf denen der Inhalt ursprünglich in der CP-1252-Codierung (z Kopieren / Einfügen von Word).

gespeichert wurde

Die Moral der Geschichte hier: Bei der Lagerung immer internationalisierten Text als Unicode in Ihrer Datenbank und immer emittieren HTML als UTF8 auf Ihrem Webserver

!

Andere Tipps

Ich glaube, dass die HttpWebResponse eine Contenten Eigenschaft hat. Verwenden Sie es im Konstruktor Ihrer Stream.

Daniel, Einige Seiten nicht einmal einen Wert im CharacterSet zurückkehren, so dass dieser Ansatz ist nicht so zuverlässig. Manchmal nicht einmal der Browser ist in der Lage zu „erraten“, die Codierung zu verwenden, so dass ich glaube, Sie nicht 100% enconding recogniton tun können.

In meinem speziellen Fall, wie ich mit spanischen oder portugiesischen Seiten beschäftigen, verwende ich die UTF7 Codierung und es funktioniert für mich (áéíóúñÑêã ... usw.) in Ordnung.

Mai werden Sie zuerst eine Tabelle von CharacterSet Codes und ihre entsprechenden Kodierung laden können. Und falls der CharacterSet leer ist, können Sie eine Standardkodierung zur Verfügung stellen.

Der detectEncodingFromByteOrderMarks Parameter im StreamReader Konstruktor kann ein wenig helfen, da es automatisch einige Codierungen von dem ersten Bytes erkennt oder folgert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top