WebClient.DownloadString restituisce caratteri alterati a causa di problemi di codifica, ma il browser è OK


86

Il codice seguente:

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

risulta in una variabile textche contiene, tra molte altre cose, la stringa

"$ Κ $ -Minkowski spazio, campo scalare e problema dell'invarianza di Lorentz"

Tuttavia, quando visito quell'URL in Firefox, ottengo

$ κ $ -Spazio di Minkowski, campo scalare e problema dell'invarianza di Lorentz

che è effettivamente corretto. Ho anche provato

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

ma questo ha dato lo stesso problema.

Non sono sicuro di dove sia la colpa qui. Il feed sta mentendo sul fatto di essere codificato in UTF8 e il browser è abbastanza intelligente da capirlo, ma non WebClient? Il feed è codificato correttamente in UTF8, ma WebClientnon funziona in altro modo? Cosa posso fare per mitigare questo problema?


6
UTF8Encoding.Defaultè in realtà Encoding.Default, che è la codifica ANSI basata sulle impostazioni della lingua del sistema operativo.
svick

Risposte:


205

Non sta mentendo. È necessario impostare la codifica del client Web prima di chiamare 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");
}

Per quanto riguarda il motivo per cui la tua alternativa non funziona, è perché l'utilizzo non è corretto. Dovrebbe essere:

System.Text.Encoding.UTF8.GetString()

9
Eccellente grazie! Strano che WebClientnon usi le intestazioni per rilevarlo, ma funziona perfettamente, e tra te e @svick, capisco perché anche l'altra cosa che ho provato stava fallendo miseramente.
Domenic

1
Lavora per UploadString oltre
irfandar
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.