WebClient.DownloadString führt aufgrund von Codierungsproblemen zu verstümmelten Zeichen, aber der Browser ist in Ordnung

84

Der folgende Code:

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

führt zu einer Variablen text, die unter anderem die Zeichenfolge enthält

"$ κ $ -Minkowski-Raum, Skalarfeld und das Problem der Lorentz-Invarianz"

Wenn ich jedoch diese URL in Firefox besuche, erhalte ich

$ κ $ -Minkowski-Raum, Skalarfeld und das Problem der Lorentz-Invarianz

das ist eigentlich richtig. Ich habe es auch versucht

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);

aber das gab das gleiche Problem.

Ich bin mir nicht sicher, wo der Fehler hier liegt. Liegt der Feed daran, UTF8-codiert zu sein, und der Browser ist intelligent genug, um das herauszufinden, aber nicht WebClient? Ist der Feed ordnungsgemäß UTF8-codiert, schlägt aber WebClientauf andere Weise fehl ? Was kann ich tun, um dies zu mildern?

Domenic
quelle
5
UTF8Encoding.Defaultist eigentlich Encoding.Defaultdie ANSI-Codierung, die auf den Spracheinstellungen des Betriebssystems basiert.
Svick

Antworten:

200

Es lügt nicht. Sie sollten zuerst die Codierung des Webclients festlegen, bevor Sie DownloadString aufrufen.

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");
}

Warum Ihre Alternative nicht funktioniert, liegt daran, dass die Verwendung falsch ist. Es sollte sein:

System.Text.Encoding.UTF8.GetString()
LostInComputer
quelle
9
Ausgezeichnet, vielen Dank! Seltsam, dass der WebClientdie Header nicht verwendet, um dies zu erkennen, aber das funktioniert perfekt, und zwischen Ihnen und @svick verstehe ich, warum das andere, was ich versucht habe, auch kläglich fehlgeschlagen ist.
Domenic
1
Arbeiten für UploadStringund
irfandar