C#WebClient - 在下载页面时获取一个方括号内的问号而不是øæå

时间:2010-12-29 23:24:34

标签: c# webclient

我正在使用WebClient从挪威网站下载网页。在下载的数据中,所有特殊字符(øæå)都缺失,而是由问号类型char替换。

在我的html文件中添加“”之前,我曾经在我的网页上遇到过这个问题,这里有这个问题。

如果我打开浏览器并浏览到该地址,一切看起来都不错。

我已经使用fiddler来确切地查看我需要发送的标题,并且我使用im发送与我的浏览器完全相同的所有内容。

因此,通过演绎的力量,我相信WebClient是罪犯,并且在将数据返回给我之前以某种方式削弱了数据,并且我不确定如何阻止他这样做。

有关详细信息,这是我获取网页的代码:

string result = string.Empty;

using (WebClient client = new WebClient())
{     
     client.Headers["Accept"] = "application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*";
     client.Headers["Referer"] = "http://mywebsite.no/forum/viewforum.php?f=7";
     client.Headers["Accept-Language"] = "nb-NO";
     client.Headers["User-Agent"] = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; AskTbFXTV5/5.9.1.14019)";
     client.Headers["Accept-Encoding"] = "gzip, deflate";

     using (Stream stream = client.OpenRead(new Uri(textBox1.Text))) 
     { 
          using (StreamReader reader = new StreamReader(stream)) 
          {
               result = reader.ReadToEnd();
          } 
     } 
}

任何提示?

4 个答案:

答案 0 :(得分:0)

您是否尝试过在响应中设置编码?

        string result = string.Empty;

        using (WebClient client = new WebClient())
        {
            client.Headers["Accept"] = "application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*";
            client.Headers["Referer"] = "http://mywebsite.no/forum/viewforum.php?f=7";
            client.Headers["Accept-Language"] = "nb-NO";
            client.Headers["User-Agent"] = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; AskTbFXTV5/5.9.1.14019)";
            client.Headers["Accept-Encoding"] = "gzip, deflate";

            using (Stream stream = client.OpenRead(new Uri("")))
            {
                byte[] resultBytes = StreamUtil.ReadToEnd(stream);
                result = System.Text.ASCIIEncoding.UTF8.GetString(resultBytes);
            }
        }

internal class StreamUtil
{
    internal static byte[] ReadToEnd(System.IO.Stream stream)
    {
        byte[] readBuffer = new byte[4096];

        int totalBytesRead = 0;
        int bytesRead;

        while ((bytesRead = stream.Read(readBuffer, totalBytesRead, readBuffer.Length - totalBytesRead)) > 0)
        {
            totalBytesRead += bytesRead;

            if (totalBytesRead == readBuffer.Length)
            {
                int nextByte = stream.ReadByte();
                if (nextByte != -1)
                {
                    byte[] temp = new byte[readBuffer.Length * 2];
                    Buffer.BlockCopy(readBuffer, 0, temp, 0, readBuffer.Length);
                    Buffer.SetByte(temp, totalBytesRead, (byte)nextByte);
                    readBuffer = temp;
                    totalBytesRead++;
                }
            }
        }

        byte[] buffer = readBuffer;
        if (readBuffer.Length != totalBytesRead)
        {
            buffer = new byte[totalBytesRead];
            Buffer.BlockCopy(readBuffer, 0, buffer, 0, totalBytesRead);
        }
        return buffer;
    }
}

答案 1 :(得分:0)

尝试使用指定编码的StreamReader构造函数。

http://msdn.microsoft.com/en-us/library/ms143456.aspx http://msdn.microsoft.com/en-us/library/system.text.encoding.aspx

要弄清楚页面的编码,在Firefox中,您可以右键单击并选择“查看页面信息”。应该在那里列出编码。

答案 2 :(得分:0)

有两个可能的原因:

  1. 您没有使用StreamReader
  2. 的正确编码
  3. 您正在使用不支持字符的字体显示结果。
  4. 如果您知道编码是什么,并且知道它将保持不变,那么您可以在创建StreamReader对象时提供编码。

    如果没有,则必须将页面的第一部分放入字节缓冲区,以便您可以使用纯ASCII编码对其进行足够的编码以查找内容元标记,以便您可以从中确定编码那。然后,您可以使用正确的编码解码缓冲区和页面的其余部分。

    正如你所说的“问号内的方形字符”而不只是问号,它让我怀疑它可能正在显示实际上是问题的内容,而不是解码它。解码问题会产生常规问号,而字体包含一个特殊字符,用于表示与您描述完全相同的字形。

答案 3 :(得分:0)

正如其他人所说,您可能没有设置正确的编码。请参阅how to detect encoding of the response body,其中显示了如何从响应标头或响应正文中的HTML META标记中猜测编码。