Laden...

WebClient - Klasse

Erstellt von SvenH vor 17 Jahren Letzter Beitrag vor 17 Jahren 2.691 Views
S
SvenH Themenstarter:in
51 Beiträge seit 2005
vor 17 Jahren
WebClient - Klasse

Hallo,
ich habe folgenden Code:


WebClient wc = new WebClient();
Byte[] Bytes;

Bytes = wc.DownloadData("http://wetter.de");
string html = Encoding.UTF8.GetString(Bytes);

Nun steht der gesamte Html-Quellcode im String "html".
Allerdings sind im Quellcode alle Umlaute verschluckt.
Statt bewölkt steht bewlkt.

Hat jemand eine Idee, wie ich das verschlucken der Umlaute verhindern kann?

S
33 Beiträge seit 2004
vor 17 Jahren

Hallo SvenH,

dein Encoding stimmt nicht.

121 Beiträge seit 2006
vor 17 Jahren

Original von SvenH
string html = Encoding.UTF8.GetString(Bytes);

Probierst Du mal
string html = Encoding.ASCII.GetString(Bytes)

Gruß Hape

S
SvenH Themenstarter:in
51 Beiträge seit 2005
vor 17 Jahren

Original von hape

Original von SvenH
string html = Encoding.UTF8.GetString(Bytes);

Probierst Du mal
string html = Encoding.ASCII.GetString(Bytes)

Gruß Hape

Mit ASCII bekomme ich statt dem Umlaut ein Fragezeichen.
>> bew?lkt

121 Beiträge seit 2006
vor 17 Jahren

Hi SvenH,

kannst Du nicht einfach morgen nochmal testen. Dann komt "sonnig". Dann paßt es ja 🙂

Ne, im ernst:

bewökt 

hätte ich erwartet.
Wo schaust Du Dir das html Ergebnis an, in der Console, im Debugger, in der Dos-
Box? Macht schon einen Unterschied.

Gruß Hape

121 Beiträge seit 2006
vor 17 Jahren

... wenn nicht, dann ist es wahrscheinlich ISO-8859-1.
Dann müßte es klappen. MSDN
Gruß Hape

S
33 Beiträge seit 2004
vor 17 Jahren

Ihr sollt nicht probieren welcher Encoding Std die Seite verwendet! Sowas steht im QT der html Datei

121 Beiträge seit 2006
vor 17 Jahren

Hi Sharkx,
wie zieht man aus einem HTML-Dokument den charset

<meta http-equiv="Content-Type" content="text/html; charset=windows-1252"

z.B. raus? Ich meine ein robustes Verfahren, das in allen Fällen paßt. Das parsen einer HTML Seite kann, wenn sie nicht XHTML-konform ist, ja auch in die Hose gehen.
Naja, das ist nur interessehalber hier.
Liefert nicht der HTTP HEAD (statt HTTP GET) bereits diese Infos?
Gruß Hape

B
1.529 Beiträge seit 2006
vor 17 Jahren

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.wetter.de");
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader readStream = new StreamReader (response.GetResponseStream(), Encoding.GetEncoding(response.ContentEncoding));
string html = readStream.ReadToEnd();
readStream.Close ();
response.Close ();

S
SvenH Themenstarter:in
51 Beiträge seit 2005
vor 17 Jahren

So, nun habe ich mal folgendes versucht:

html = Encoding.GetEncoding("Windows-1252").GetString(Bytes);

Allerdings kann ich es nun nicht testen, das es nicht mehr leicht bewölkt ist.
Es ist in Rostock wolkig 🙂.

121 Beiträge seit 2006
vor 17 Jahren

Das ist gut, wirklich.

Aber dann verzichtet man besser auf WebClient.DownloadData() und nimmt Borg's vorgeschlagenen WebRequest.Create() und .GetResponse().

D.h. wenn man das Encoding kennt, dann
WebClient.DownloadData()

sonst
WebRequest.Create() und .GetResponse()

Korrekt?
Gruß Hape

B
1.529 Beiträge seit 2006
vor 17 Jahren

Richtig. Und wenn man das Encoding kennt und einen String haben will, dann nimmt man WebClient.DownloadString().


string html;
using (WebClient wc = new WebClient())
{
   wc.Encoding = Encoding.ASCII; // oder was auch immer;
   html = wc.DownloadString("whatever.url");
}
121 Beiträge seit 2006
vor 17 Jahren

Klasse!

S
SvenH Themenstarter:in
51 Beiträge seit 2005
vor 17 Jahren

Soweit so gut, das charset ist ISO-8859-1.
Nur gibt es für jene Codierung keine Eigenschaft in der Klasse Encoding.
Allerdings gibt es eine Methode GetEncoding() welcher ich zwar nicht "ISO-8859-1" aber das Windows-Equivalent übergeben kann (Windows-1252).

Ich habe es an einer anderen Html-Site getestet, welche noch bewölkt ist.
Und ... es funktioniert.

Vielen Dank für das rege Interesse, denn jenes Interesse hat mich überredet am Fr. um diese Zeit noch meinen Kopf anzustrengen.

Nun ist aber die Zeit für ein Gläschen gekommen 🙂
Schluck!