Различия в кодировке между использованием WebClient и WebRequest? - PullRequest
4 голосов
/ 26 января 2012

Получая индекс какой-то случайной испанской газеты, я неправильно получаю диакритические знаки с помощью WebRequest, они выдают странный символ: , при загрузке ответа из того же URI с помощью WebClient я получаю соответствующий ответ.

Почему это различие?

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

против

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

1 Ответ

4 голосов
/ 26 января 2012

Вы просто предполагаете, что объект находится в UTF-8 при создании вашего потокового считывателя без явной настройки кодировки.Вы должны проверить CharacterSet HttpWebResponse (не предоставляется базовым классом WebResponse) и открыть StreamReader с соответствующей кодировкой.

В противном случае, если он читает что-то, что не является UTF-8, как если бы это был UTF-8, он наткнется на последовательности октетов, которые недопустимы в UTF-8 и должны заменить символ замены U + FFFD () как можно лучше.

WebClient делает в значительной степени следующее: DownloadString - это метод более высокого уровня, когда WebRequest и его производные классы позволяют перейти на более низкий уровень, он имеет один вызов для «отправки запроса GET на URI,изучите заголовки, чтобы увидеть, какая кодировка содержимого используется, на случай, если вам нужно распаковать или распаковать ее, посмотреть, какая кодировка символов установлена, настроить программу чтения текста с этой кодировкой и потоком, изатем позвоните ReadAll() ".Обычные инструкции высокого уровня большого куска по сравнению с инструкциями низкого уровня малого куска плюсы и минусы применяются.

...