我正在使用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(); } } }
任何提示?
答案 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)
有两个可能的原因:
StreamReader
。如果您知道编码是什么,并且知道它将保持不变,那么您可以在创建StreamReader
对象时提供编码。
如果没有,则必须将页面的第一部分放入字节缓冲区,以便您可以使用纯ASCII编码对其进行足够的编码以查找内容元标记,以便您可以从中确定编码那。然后,您可以使用正确的编码解码缓冲区和页面的其余部分。
正如你所说的“问号内的方形字符”而不只是问号,它让我怀疑它可能正在显示实际上是问题的内容,而不是解码它。解码问题会产生常规问号,而字体包含一个特殊字符,用于表示与您描述完全相同的字形。
答案 3 :(得分:0)
正如其他人所说,您可能没有设置正确的编码。请参阅how to detect encoding of the response body,其中显示了如何从响应标头或响应正文中的HTML META标记中猜测编码。