在C#中,如何在不破坏任何编码的情况下将网页保存到文件中?

在C#中,如何在不破坏任何编码的情况下将网页保存到文件中?,c#,encoding,C#,Encoding,这是我到目前为止得到的(不起作用)。在这一点上,我认为我的目标是Ansi编码的,但我真的不想知道在这一点上。我的浏览器似乎能够确定要使用什么编码,我该怎么做 static void GetUrl(Uri uri, string localFileName) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); HttpWebResponse response; response = (Htt

这是我到目前为止得到的(不起作用)。在这一点上,我认为我的目标是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网站上测试):


web浏览器检测字符编码的方式有三种

查找(如果是HTML):


您应该查找服务器发送响应的编码<代码>编码。默认值不会在此处切割芥末。:-)


可以肯定的是,您可以将所有内容转换为UTF-8,并始终将文件存储为UTF-8。这样,您在读取文件时就不需要猜测编码。

我正在使用标题信息来处理当前情况。Encoding.GetEncoding(response.CharacterSet);现在看来这是个好办法。你的编辑是否意味着你正在按照我的建议去做?如果是这样,你应该移动“接受答案”勾号。事实上,我考虑过,但我不知道这里的协议。正如Lubos建议检查标题的内容类型部分中的字符集一样。卢布斯有更多的信息,但你的建议转换utf-8是非常有价值的。我希望我能合并答案。卢布斯的答案让我在读你的帖子之前就找到了Encoding.GetEncoding(response.CharacterSet);但你的帖子实际上有C代码。我对这两个问题都投了赞成票,给他留下了答案,因为他是第一个引导我找到答案的人,我发布了修改后的代码,以表示对你的文章和未来读者的尊重。
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();
    }
}
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<?xml version="1.0" encoding="ISO-8859-1"?>
Content-Type: text/html; charset=ISO-8859-1
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))
{  /* ... */ }