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

85

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

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не работает ли какой-то другой способ? Что я могу сделать, чтобы это смягчить?

Доменик
источник
6
UTF8Encoding.DefaultФактически Encoding.Default, это кодировка ANSI, основанная на языковых настройках ОС.
svick

Ответы:

201

Это не ложь. Вы должны сначала установить кодировку веб-клиента, прежде чем вызывать 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()
LostInComputer
источник
9
Отлично, спасибо! Странно, что WebClientне используются заголовки для обнаружения этого, но это работает отлично, и между вами и @svick я понимаю, почему другая вещь, которую я пробовал, также терпит неудачу.
Доменик
1
Работы для UploadStringа
irfandar