Распознание кодировки
От: Krypt  
Дата: 10.05.09 12:50
Оценка:
Получаю из сети rss-ленту примерно вот таким кодом:

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(Uri);

HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream receiveStream = response.GetResponseStream();

readStream = new StreamReader(receiveStream, true);

string text = readStream.ReadToEnd();


В случае с http://lenta.ru/rss/ неверно распознаётся кодировка — как utf-8, хотя на самом деле windows-1251

Верную кодировку можно узнать через XmlDeclaration, но к этому месту уже не известен receiveStream.
Как можно перегнать строку из неверно определённой кодировки в нужную, либо заставить прочесть кодировку верно?
Изыскания в направлении System.Text.Encoding пока ни к чему (ктоме "<title>Lenta.ru: пїЅпїЅпїЅпїЅпїЅпїЅпїЅ</title>") не привели, сама лента может быть любая (и начальная и конечные кодировки, соотвественно тоже), причём не всегда xml-валидная (надо через фильтры прогонять)
Re: Распознание кодировки
От: NovaCxarmulo Россия http://timofey.koolin.ru
Дата: 10.05.09 13:09
Оценка:
Здравствуйте, Krypt, Вы писали:

K>Верную кодировку можно узнать через XmlDeclaration, но к этому месту уже не известен receiveStream.

K>Как можно перегнать строку из неверно определённой кодировки в нужную, либо заставить прочесть кодировку верно?
K>Изыскания в направлении System.Text.Encoding пока ни к чему (ктоме "<title>Lenta.ru: пїЅпїЅпїЅпїЅпїЅпїЅпїЅ</title>") не привели, сама лента может быть любая (и начальная и конечные кодировки, соотвественно тоже), причём не всегда xml-валидная (надо через фильтры прогонять)

Как вариант — прочитать сначала в MemoryStream, оттуда вытянуть XmlDeclaration или провести статистический анализ и потом уже читать ленту в правильной кодировке
Сражение выигрывает тот, кто твердо решил его выиграть
(с) Л.Н. Толстой
Re: Распознание кодировки
От: Andir Россия
Дата: 10.05.09 13:31
Оценка: 2 (1)
Здравствуйте, Krypt, Вы писали:

K>В случае с http://lenta.ru/rss/ неверно распознаётся кодировка — как utf-8, хотя на самом деле windows-1251


Кодировка не распознаётся принципиально. StreamReader этого не умеет и по умолчанию использует utf-8, а автоматическое определение кодировки (булев параметр конструктора) делает только для подсемейства Unicode (см. преамбула).

K>Верную кодировку можно узнать через XmlDeclaration, но к этому месту уже не известен receiveStream.

K>Как можно перегнать строку из неверно определённой кодировки в нужную, либо заставить прочесть кодировку верно?
K>Изыскания в направлении System.Text.Encoding пока ни к чему (ктоме "<title>Lenta.ru: пїЅпїЅпїЅпїЅпїЅпїЅпїЅ</title>") не привели, сама лента может быть любая (и начальная и конечные кодировки, соотвественно тоже), причём не всегда xml-валидная (надо через фильтры прогонять)

Читать надо так:
using(var reader = new StreamReader(receiveStream, Encoding.GetEncoding("windows-1251")))
  return reader.ReadToEnd();


Нужную кодировку содержимого можно узнать либо из заголовка Content-Type, либо действительно парсить xml.

С Уважением, Andir!
Re[2]: Распознание кодировки
От: Krypt  
Дата: 10.05.09 13:58
Оценка:
Здравствуйте, Andir, Вы писали:

A>Здравствуйте, Krypt, Вы писали:


K>>В случае с http://lenta.ru/rss/ неверно распознаётся кодировка — как utf-8, хотя на самом деле windows-1251


A>Кодировка не распознаётся принципиально. StreamReader этого не умеет и по умолчанию использует utf-8, а автоматическое определение кодировки (булев параметр конструктора) делает только для подсемейства Unicode (см. преамбула).


K>>Верную кодировку можно узнать через XmlDeclaration, но к этому месту уже не известен receiveStream.

K>>Как можно перегнать строку из неверно определённой кодировки в нужную, либо заставить прочесть кодировку верно?
K>>Изыскания в направлении System.Text.Encoding пока ни к чему (ктоме "<title>Lenta.ru: пїЅпїЅпїЅпїЅпїЅпїЅпїЅ</title>") не привели, сама лента может быть любая (и начальная и конечные кодировки, соотвественно тоже), причём не всегда xml-валидная (надо через фильтры прогонять)

A>Читать надо так:

A>
A>using(var reader = new StreamReader(receiveStream, Encoding.GetEncoding("windows-1251")))
A>  return reader.ReadToEnd();
A>


A>Нужную кодировку содержимого можно узнать либо из заголовка Content-Type, либо действительно парсить xml.


A>С Уважением, Andir!


Ага, тогда в любом случае придётся довольно сильно переделывать эту часть библиотеки. Спасибо.
Re[2]: Распознание кодировки
От: Krypt  
Дата: 10.05.09 14:10
Оценка:
A>Нужную кодировку содержимого можно узнать либо из заголовка Content-Type, либо действительно парсить xml.
Content-Type в данном случае — application/rss+xml, кодировка не указанна. Так что придется предварительно обрабатываьб xml
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.