这是我第一个出现问题的维基百科页面。当我使用HttpWebResponse.GetResponseStream()打开这个页面时,https://en.wikipedia.org/wiki/London充满了mojibake。但我的浏览器可以毫无问题地对它进行编码。
我使用了三种方法下载文本文件。他们都得到了不同的文件。
第一个方法下载了一个274,851字节的文件。
string TargetUri = "https://en.wikipedia.org/wiki/London";
HttpWebRequest queryPage = (HttpWebRequest)WebRequest.Create(TargetUri);
queryPage.Credentials = CredentialCache.DefaultCredentials;
using (HttpWebResponse response = (HttpWebResponse)queryPage.GetResponse())
{
using (Stream PageRawCode = response.GetResponseStream())
{
using (MemoryStream PageRawCodeDuplicate = new MemoryStream())
{
byte[] buffer = new byte[1024];
int ByteCount;
do
{
ByteCount = PageRawCode.Read(buffer, 0, buffer.Length);
PageRawCodeDuplicate.Write(buffer, 0, ByteCount);
} while (ByteCount > 0);
PageRawCodeDuplicate.Seek(0, SeekOrigin.Begin);
using (StreamReader CodeInUTF8 = new StreamReader(PageRawCodeDuplicate))
{
string PageText = CodeInUTF8.ReadToEnd();
using (StreamWriter sw = new StreamWriter(@"E:\My Documents\Desktop\london1.html"))
{
sw.Write(PageText);
}
}
}
}
}第二种方法是
WebClient myWebClient = new WebClient();
myWebClient.DownloadFile("https://en.wikipedia.org/wiki/London", @"E:\My Documents\Desktop\london2.html");此方法仅下载了一个152.297字节的文件。
第三种方法是打开https://en.wikipedia.org/wiki/London,并保存源代码文件。此方法将得到1,746,420字节的文件。
我不明白为什么使用不同的方法获取文本文件会有这样的区别。
我使用了ASCII,BigEndianUnicode,Unicode,UTF32,UTF7,UTF8来读取前两个文件。它们都没有正确显示代码。
然后我读了文件的十六进制代码。london1.html的前32个字符是
1FEFBFBD0800000000000003EFBFBDEFlondon2.html的前32个字符是
1F8B0800000000000003ECFD4B8F1C49很明显他们不是<!DOCTYPE html>
这两个文件是什么?我甚至都不知道怎么检查它们。
发布于 2013-09-17 12:38:19
谜团终于解开了!文本流是一个GZipStream。使用GZipStream解压缩可以读取代码。http://msdn.microsoft.com/en-us/library/system.io.compression.gzipstream.aspx很难想象浏览器在后面做了多少
发布于 2013-09-15 19:28:01
代码中有一个简单的问题。你忘了冲洗内存流了。我还添加了第二个解决方案,它不会先在内存中复制流.
如果我运行这个稍微修改过的代码,我将得到一个完整的html文件:
using (HttpWebResponse response = (HttpWebResponse)queryPage.GetResponse())
{
using (Stream PageRawCode = response.GetResponseStream())
{
using (MemoryStream PageRawCodeDuplicate = new MemoryStream())
{
byte[] buffer = new byte[1024];
int ByteCount;
do
{
ByteCount = PageRawCode.Read(buffer, 0, buffer.Length);
PageRawCodeDuplicate.Write(buffer, 0, ByteCount);
} while (ByteCount > 0);
// FLUSH!
PageRawCodeDuplicate.Flush();
PageRawCodeDuplicate.Seek(0, SeekOrigin.Begin);
// Pick an encoding here
using (StreamReader CodeInUTF8 = new StreamReader(
PageRawCodeDuplicate, Encoding.UTF8))
{
string PageText = CodeInUTF8.ReadToEnd();
using (StreamWriter sw = new StreamWriter(@"london1.html"))
{
sw.Write(PageText);
}
}
}
}
}流的直接副本
using (HttpWebResponse response = (HttpWebResponse)queryPage.GetResponse())
{
using (Stream PageRawCode = response.GetResponseStream())
{
using (StreamReader CodeInUTF8 = new StreamReader(
PageRawCode, Encoding.UTF8))
{
using (StreamWriter sw = new StreamWriter(@"london1.html"))
{
while (!CodeInUTF8.EndOfStream)
{
sw.WriteLine(CodeInUTF8.ReadLine());
}
}
}
}
}https://stackoverflow.com/questions/17895548
复制相似问题