Потеря кодировки сайта через WebClient
Делаю запрос на серверы гугл и получаю вместо русского языка крокозябру, менял кодировки не помогло, может у гугла на поисковик какая нибудь хитрая кодировка стоит. Класс для отправки запроса:
public static class MyWebRequest
{
public static string Get(string url, Dictionary<string, string> QueryParameters = null, Encoding encoding = null)
{
using var webClient = new WebClient();
if (encoding != null)
{
webClient.Encoding = encoding;
}
if (QueryParameters != null && QueryParameters.Count != 0)
{
foreach (var queryParameter in QueryParameters)
{
webClient.QueryString.Add(queryParameter.Key, queryParameter.Value);
}
}
return webClient.DownloadString(url);
}
}
Сам запрос:
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
var result = MyWebRequest.Get("https://www.google.com/search",
new Dictionary<string, string>() { ["q"] = textBoxSearch.Text.Replace(' ', '+')}, Encoding.GetEncoding("UTF-8"));
Сам сайт гугла говорит что у него в UTF-8 мол поисковая страница стоит. В чем может быть проблема? П.С. переписал запрос на HttpClient но крокозябры остались
public static string Get(string url, Dictionary<string, string> QueryParameters = null)
{
Task<HttpResponseMessage> response;
if (QueryParameters != null && QueryParameters.Count != 0)
{
response = client.GetAsync($"{url}?{QueryParameters.Select(s => $"{s.Key}={s.Value}").Aggregate((a, b) => $"{a}&{b}")}");
}
else
{
response = client.GetAsync(url);
}
return response.Result.Content.ReadAsStringAsync().Result;
}
Ответы (1 шт):
Делаете много лишних телодвижений.
public static class MyWebRequest
{
private static readonly HttpClient client = new HttpClient(new HttpClientHandler { AutomaticDecompression = DecompressionMethods.All })
{
DefaultRequestVersion = HttpVersion.Version20
};
public static async Task<string> GetAsync(string url, Dictionary<string, string> queryParameters = null)
{
UriBuilder builder = new UriBuilder(url);
if (queryParameters?.Count > 0)
{
builder.Query = await new FormUrlEncodedContent(queryParameters).ReadAsStringAsync();
}
return await client.GetStringAsync(builder.Uri);
}
}
Проверяю, использую NuGet пакет HtmlAgilityPack.
static async Task Main(string[] args)
{
var html = await MyWebRequest.GetAsync("https://www.google.com/search", new Dictionary<string, string>() { ["q"] = "get запрос C#" });
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);
var title = HtmlEntity.DeEntitize(doc.DocumentNode.SelectSingleNode("//title").InnerText);
Console.WriteLine(title);
}
Вывод в консоль
get запрос C# - Поиск в Google
Кодировки типа ANSI и UTF-8 определяются автоматически. А если зарегать провайдер Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); то и Win1251 скушает само.
Асинхронный обработчик кнопки в WPF выглядел бы так.
private async void Button1_Click(object sender, RoutedEventArgs e)
{
Button btn = (Button)sender;
btn.IsEnabled = false; // защита от повторного нажатия, так как
// если не морозить UI, теперь он работает во время выполнения кода.
// в этом и есть смысл асинхронности здесь
var html = await MyWebRequest.GetAsync("https://www.google.com/search", new Dictionary<string, string>() { ["q"] = "get запрос C#" });
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);
var title = HtmlEntity.DeEntitize(doc.DocumentNode.SelectSingleNode("//title").InnerText);
Debug.WriteLine(title);
btn.IsEnabled = true;
}