81 votes

WebClient.DownloadString produit des caractères tronqués en raison de problèmes d'encodage, mais le navigateur est OK.

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 lieu à une variable text qui contient, parmi de nombreuses autres choses, la chaîne de caractères

"$$-Minkowski space, scalar field, and the issue of Lorentz invariance"

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

$$-Minkowski space, scalar field, and the issue of Lorentz invariance (en anglais)

ce qui est en fait correct. J'ai également 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 donné le même problème.

Je ne sais pas où est la faute. Est-ce que le flux ment en disant qu'il est encodé en UTF8, et que le navigateur est assez intelligent pour s'en rendre compte, mais pas WebClient ? Le flux est correctement codé en UTF8, mais WebClient est défaillant d'une autre manière ? Que puis-je faire pour atténuer ce problème ?

193voto

LostInComputer Points 4851

Ce n'est pas un mensonge. Vous devez d'abord définir l'encodage du webclient 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 l'utilisation est incorrecte. Il devrait l'être :

System.Text.Encoding.UTF8.GetString()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X