WebClient.DownloadString приводит к искаженным символам из-за проблем с кодировкой, но браузер в порядке.

Следующий код:

var text = (new WebClient()).DownloadString("http://export.arxiv.org/api/query?search_query=au:Freidel_L*&start=0&max_results=20"));

приводит к переменной text, которая содержит, помимо прочего, строку

"$ κ $- пространство Минковского, скалярное поле и проблема лоренц-инвариантности"

Однако, когда я посещаю этот URL в Firefox, я получаю

$κ $-Минковское пространство, скалярное поле и проблема лоренц-инвариантности

что на самом деле правильно. Я также пробовал

var data = (new WebClient()).DownloadData("http://export.arxiv.org/api/query?search_query=au:Freidel_L*&start=0&max_results=20");
var text = System.Text.UTF8Encoding.Default.GetString(data);

но это дало ту же проблему.

Я не знаю, где здесь виновата. Является ли корм лежащим в кодировке UTF8, и браузер достаточно умен, чтобы понять это, но не WebClient? Правильно ли кодируется кодировка UTF8, но WebClient работает некорректно? Что я могу сделать, чтобы уменьшить это?

Ответ 1

Он не лжет. Перед вызовом DownloadString необходимо сначала установить кодировку Webclient.

using(WebClient webClient = new WebClient())
{
webClient.Encoding = Encoding.UTF8;
string s = webClient.DownloadString("http://export.arxiv.org/api/query?search_query=au:Freidel_L*&start=0&max_results=20");
}

Что касается того, почему ваша альтернатива не работает, это связано с неправильным использованием. Его должно быть:

System.Text.Encoding.UTF8.GetString()