编码使用WebClient和WebRequest之间的差异?

时间:2012-01-26 14:39:48

标签: c# webclient webrequest

在获取一些随机的西班牙报纸的索引时,我没有使用WebRequest正确地得到变音符号,他们产生这个奇怪的字符:,同时使用WebClient从同一个uri下载响应我得到适当的回应。

为什么会出现这种差异?

var client = new WebClient();
string html = client.DownloadString(endpoint);

VS

WebRequest request = WebRequest.Create(endpoint);
using (WebResponse response = request.GetResponse())
{
    Stream stream = response.GetResponseStream();
    StreamReader reader = new StreamReader(stream);
    string html = reader.ReadToEnd();
}

1 个答案:

答案 0 :(得分:4)

您只是假设在创建流式读取器时实体是UTF-8而未明确设置编码。您应该检查CharacterSet的{​​{1}}(未由HttpWebResponse基类公开),并使用适当的编码打开WebResponse

否则,如果它读取的东西不是UTF-8,就好像它是UTF-8一样,它会遇到在UTF-8中无效的八位字节序列,并且必须用U + FFFD替换字符替换( StreamReader)尽可能做到最好。

WebClient做了很多这样的事情:是一个更高级别的方法,在DownloadString及其派生类允许你进入较低级别的方法中,它只有一个调用“向GET请求发送一个GET请求URI,检查标题以查看正在使用的内容编码,以防您需要解压缩或解压缩,查看字符编码是什么,设置具有该编码的文本阅读器和流,然后调用WebRequest“。正常的高级别大块指令与低级别小块指令的优缺点适用。