Как загрузить страницу в кодировке 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 шт):

Автор решения: aepot

Там помимо мета-заголовка есть еще 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 все сделает сам.

→ Ссылка