Как загрузить страницу в кодировке Windows-1251 с помощью HttpClient
Ссылка на веб-страницу: http://www.aquatika.ru/prods_rectangular.html
Как видно в <head> нам указана кодирока windows-1251
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
Пытаюсь декодировать так:
var htm =Client.GetStringAsync(host + collection.QuerySelector("a").GetAttribute("href")).Result;
Encoding utf8 = Encoding.GetEncoding("UTF-8");
Encoding win1251 = Encoding.GetEncoding("windows-1251");
byte[] utf8Bytes = win1251.GetBytes(htm);
byte[] win1251Bytes = Encoding.Convert(utf8, win1251, utf8Bytes);
var document1 = await Program.context.OpenAsync(req => req.Content(win1251.GetString(win1251Bytes)));
Но выдает в консоли, вместо русских букв:
?????????????
При наводе на переменную в отладчике так же отображаются вопросы. Что делать?
Ответы (1 шт):
Там помимо мета-заголовка есть еще HTTP заголовок в ответе от сервера, который собственно и играет ключевую роль в данном вопросе
Content-Type: text/html; charset=windows-1251
По умолчанию для неподдерживаемых кодировок HttpClient при попытке загрузить веб-страницу выдает исключение:
System.InvalidOperationException: The character set provided in ContentType is invalid.
Cannot read content as string using an invalid character set.
Чтобы это вылечить, при старте приложения (один раз) выполните:
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
Оно зарегистрирует кодовые страницы Windows, как это происходит в старом .NET Framework. Тогда windows-1251 будет распознана HTTP клиентом автоматически.
Вот тестовый пример:
using HtmlAgilityPack;
using Fizzler.Systems.HtmlAgilityPack;
public class Program
{
private static HttpClient client = new HttpClient();
public static async Task Main()
{
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
string html = await client.GetStringAsync("http://www.aquatika.ru/prods_rectangular.html");
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);
Console.WriteLine(doc.DocumentNode.QuerySelector("title").InnerText);
}
}
Вывод в консоль
Прямоугольные акриловые ванны 150-190х70-120
И никаких плясок с бубном вокруг кодировок не потребуется, HttpClient все сделает сам.