WebClient.DownloadString entraîne des caractères mutilés en raison de problèmes d'encodage, mais le navigateur fonctionne correctement

85

Le code suivant:

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

donne une variable textqui contient, entre autres, la chaîne

"$ κ $ -espace de Minkowski, champ scalaire et problème de l'invariance de Lorentz"

Cependant, lorsque je visite cette URL dans Firefox, j'obtiens

$ κ $ -Espace de Minkowski, champ scalaire et problème de l'invariance de Lorentz

ce qui est en fait correct. J'ai aussi essayé

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

mais cela a posé le même problème.

Je ne sais pas où est la faute ici. Le flux ment-il sur le fait qu'il est encodé en UTF8 et le navigateur est suffisamment intelligent pour comprendre cela, mais pas WebClient? Le flux est-il correctement encodé en UTF8, mais WebClientéchoue-t-il d'une autre manière? Que puis-je faire pour atténuer cela?

Domenic
la source
6
UTF8Encoding.Defaultest en fait Encoding.Default, qui est un codage ANSI basé sur les paramètres de langue du système d'exploitation.
svick

Réponses:

201

Ce n'est pas un mensonge. Vous devez d'abord définir le codage du client Web avant d'appeler 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");
}

Quant à savoir pourquoi votre alternative ne fonctionne pas, c'est parce que son utilisation est incorrecte. Cela devrait être:

System.Text.Encoding.UTF8.GetString()
LostInComputer
la source
9
Excellent merci! Étrange que le WebClientn'utilise pas les en-têtes pour détecter cela, mais cela fonctionne parfaitement, et entre vous et @svick, je comprends pourquoi l'autre chose que j'ai essayée échouait misérablement aussi.
Domenic
1
Fonctionne UploadStringaussi pour
irfandar