2012-01-26 2 views
4

В получении какого-то случайного индекса испанской газеты я не получаю диакритические знаки правильно с помощью WebRequest, они дают этот странный характер: , при загрузке ответа от того же uri, используя WebClient, я получаю соответствующий ответ.Кодировка различий между использованием WebClient и WebRequest?

Почему эта дифференциация?

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(); 
} 
+0

Я предполагаю, но это, вероятно, потому, что 'WebClient.DownloadString' смотрит на заголовок' content-type' (например, «text/html; charset = utf-16») для вывода кодировки, но ваш метод WebRequest использует UTF8 (по умолчанию StreamReader) – spender

+0

заголовок 'content-type' не определяет кодировку в этом случае. – bevacqua

+0

@Nico. Затем он должен выполнить тесты для UTF-8, UTF-16LE, UTF-16BE и UTF-32 в соответствии с предварительными штрихами (для обнаружения спецификаций и других контрольных сигналов) и, наконец, по умолчанию используется устаревший набор символов по умолчанию, который происходит с сопоставить с сайтом на вашем компьютере. Поскольку HTTP предполагает Latin-1 (в конце концов, это было в начале 90-х), было бы хорошо использовать явно использование этого как ваш выбор «Я не знаю». –

ответ

4

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

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

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

+0

Кроме того, если вы хотите отразить то, что «WebClient» специально изменяет «StreamReader» на «StreamReader reader = новый StreamReader (поток, System.Text.Encoding.Default)» –

+0

@ChrisHaas Нет, это не так, быть еще хуже - хотя он мог бы работать в этом случае - в том, что он будет работать для одного кодирования, но не для UTF-8. Он проверяет заголовок и устанавливает правильное значение, которое может быть таким же, как System.Text.Encoding.Default, но, скорее всего, этого не произойдет. Если в заголовках явно не запрашивается кодировка, он пытается упорядочить UTF-8, UTF-16LE, UTF-16BE и UTF-32, видя, имеет ли результат какой-либо смысл. Наконец, если это не удается, он использует свое собственное свойство Encoding. –

+0

@ChrisHaas Конечно, если он не находит спецификацию или нулевой октет, который отдает игру, и не имеет явно заданного «кодирования», что приведет к использованию «System.Text.Encoding.Default» , –

Смежные вопросы