Как определить кодировку веб-страницы - C#
Формулировка задачи:
Написал парсер страниц. но некоторые страницы с русским текстом отображаются не правильно в textBox
проверяю контекст и если там есть "windows-1251" то сделать конвертацию. но стало ещё хуже..... новые кракозяблы появились
конвертировать пробую так
и как выше описал.
не получается.
Что не так. ?
например страница http://www. liveinternet. ru/member.php?action=lostpw немогу получить коректно <title> знаки вопроса ресует
WebRequest request = WebRequest.Create(urlString);
WebResponse response = request.GetResponse();
var cont = response.ContentType;
Stream stream = response.GetResponseStream();
if (stream != null)
{
using (StreamReader sr = new StreamReader(stream))
{
str = sr.ReadToEnd();
if (cont.Contains("windows-1251"))
{
Encoding utf = Encoding.UTF8;
Encoding win = Encoding.GetEncoding(1251);
byte[] utfArr = utf.GetBytes(str);
byte[] winArr = Encoding.Convert(win, utf, utfArr);
char[] winChars = new char[utf.GetCharCount(winArr, 0, winArr.Length)];
utf.GetChars(winArr, 0, winArr.Length, winChars, 0);
string setNew = new string(winChars);
}
}
}
byte[] bStr = Encoding.GetEncoding(1251).GetBytes(str);
string setNew = Encoding.Default.GetString(bStr);Решение задачи: «Как определить кодировку веб-страницы»
textual
Листинг программы
string DownloadString(string address)
{
return DownloadString(address, Encoding.UTF8);
}
string DownloadString(string address, Encoding defaultEncoding)
{
if (defaultEncoding == null) throw new ArgumentNullException("defaultEncoding");
byte[] data;
string contentTypeHeader = null;
using (WebClient webClient = new WebClient())
{
data = webClient.DownloadData(address);
contentTypeHeader = webClient.ResponseHeaders[HttpResponseHeader.ContentType];
}
Regex reCharset = new Regex(@"charset=""?([0-9a-zA-Z-]+)""?", RegexOptions.IgnoreCase | RegexOptions.CultureInvariant);
Encoding responseEncoding = null;
string charset = null;
if (contentTypeHeader != null)
{
Match m = reCharset.Match(contentTypeHeader);
if (m.Success)
{
charset = m.Groups[1].Value;
Debug.WriteLine("DownloadString. Encoding from ContentType header=" + charset);
}
}
if (charset == null)
{
// Заголовок Content-Type отсуствует или не содержит имя кодировки
// Ищем тег <meta http-equiv="Content-Type" content="text/html; charset=NAME">
// или тег <meta charset="utf-8">
string begin = Encoding.ASCII.GetString(data, 0, Math.Min(data.Length, 2048));
int pos = 0;
for(;;)
{
int start = begin.IndexOf("<meta", pos);
if (start == -1) break;
int end = begin.IndexOf(">", start+5);
if (end == -1) break;
Match m = reCharset.Match(begin, start, end-start);
if (m.Success)
{
charset = m.Groups[1].Value;
Debug.WriteLine("DownloadString. Encoding from meta=" + charset);
break;
}
pos = end + 1;
}
}
/* Устанавливаем пакет UDE.Charp и снимаем коментарий
if (charset == null)
{
// Кодировка не указана ни в заголовке ни в мета-теге
// Пытаемся угадать!
Ude.CharsetDetector d = new Ude.CharsetDetector();
d.Feed(data, 0, data.Length);
d.DataEnd();
if (d.Confidence > 0.8f) charset = d.Charset;
}*/
if (charset != null)
{
try { responseEncoding = Encoding.GetEncoding(charset); }
catch (ArgumentException) { }
}
responseEncoding = responseEncoding ?? defaultEncoding;
return responseEncoding.GetString(data);
}