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