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

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

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

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

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

Однако, когда я посещаю этот 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 Ответ

188 голосов
/ 21 августа 2011

Это не вранье. Вы должны установить кодировку веб-клиента перед вызовом DownloadString.

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()
...