В C # как сохранить веб-страницу в файл, не разрушая кодировку? - PullRequest
4 голосов
/ 16 ноября 2008

Вот что я получил до сих пор (это не работает). В этот момент я думал, что моя цель была закодирована Ansi, но я действительно не хочу знать об этом. Кажется, мой браузер может определить, какую кодировку использовать. Как я могу это сделать?

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();
     }
}

После ответов (в настоящее время тестируется только на сайте UTF-8):

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();
    }
}

Ответы [ 2 ]

3 голосов
/ 16 ноября 2008

Есть три способа, которыми веб-браузеры пытаются обнаружить кодировку символов.

Ищите (если это HTML):

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

или (для XHTML)

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

или иногда это даже указано в заголовке http

Content-Type: text/html; charset=ISO-8859-1
2 голосов
/ 16 ноября 2008

Вы должны искать кодировку, в которую сервер отправляет ответ. Encoding.Default здесь не подрезает горчицу : -)

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))
{  /* ... */ }

Конечно, вы можете конвертировать все в UTF-8 и всегда сохранять свой файл как UTF-8. Таким образом, вам никогда не придется угадывать кодировку при чтении файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...