4 Stimmen

Wie speichere ich in C# eine Webseite in einer Datei, ohne die Kodierung zu zerstören?

Hier ist, was ich bis jetzt habe (was nicht funktioniert). Zu diesem Zeitpunkt dachte ich, mein Ziel sei Ansi kodiert, aber das will ich jetzt wirklich nicht wissen. Mein Browser scheint in der Lage zu sein, zu bestimmen, welche Kodierung zu verwenden, Wie kann ich?

static void GetUrl(Uri uri, string localFileName)
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
    HttpWebResponse response;

    response = (HttpWebResponse)request.GetResponse();

    // Save the stream to file
    Stream responseStream = response.GetResponseStream();
    StreamReader reader = new StreamReader(responseStream, Encoding.Default);
    Stream fileStream = File.OpenWrite(localFileName);
    using (StreamWriter sw = new StreamWriter(fileStream, Encoding.Default))
    {
        sw.Write(reader.ReadToEnd());
        sw.Flush();
        sw.Close();
     }
}

Nach den Antworten (derzeit nur auf einer UTF-8-Site getestet):

static void GetUrl(Uri uri, string localFileName)
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    try
    {
        // Hope GetEncoding() knows how to parse the CharacterSet
        Encoding encoding = Encoding.GetEncoding(response.CharacterSet);
        StreamReader reader = new StreamReader(response.GetResponseStream(), encoding);
        using (StreamWriter sw = new StreamWriter(localFileName, false, encoding))
        {
            sw.Write(reader.ReadToEnd());
            sw.Flush();
            sw.Close();
        }
    }
    finally
    {
        response.Close();
    }
}

3voto

lubos hasko Punkte 24316

Es gibt drei Möglichkeiten, wie Web-Browser versuchen, die Zeichenkodierung zu erkennen.

Suchen Sie nach (wenn es HTML ist):

<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">

oder (für XHTML)

<?xml version="1.0" encoding="ISO-8859-1"?>

oder manchmal ist es sogar im http-Header angegeben

Content-Type: text/html; charset=ISO-8859-1

2voto

Tomalak Punkte 320467

Sie sollten nach der Kodierung suchen, in der der Server die Antwort sendet. Encoding.Default reicht hier nicht aus :-)

Stream responseStream = response.GetResponseStream();
Encoding enc = Encoding.GetEncoding(response.CharacterSet);
StreamReader reader = new StreamReader(responseStream, enc);
Stream fileStream = File.OpenWrite(localFileName);
using (StreamWriter sw = new StreamWriter(fileStream, enc))
{  /* ... */ }

Um sicherzugehen, könnten Sie alles in UTF-8 konvertieren und Ihre Datei immer als UTF-8 speichern. Auf diese Weise müssen Sie die Kodierung beim Lesen der Datei nicht mehr erraten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X