служба 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 74

1 ответ:

это не ложь. Вы должны установить кодировку webclient сначала перед вызовом 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()