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 text
qui 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?
UTF8Encoding.Default
est en faitEncoding.Default
, qui est un codage ANSI basé sur les paramètres de langue du système d'exploitation.Réponses:
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()
la source
WebClient
n'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.UploadString
aussi pour