WebClient.DownloadString da como resultado caracteres alterados debido a problemas de codificación, pero el navegador está bien


85

El siguiente código:

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

da como resultado una variable textque contiene, entre muchas otras cosas, la cadena

"$ κ $ -Minkowski espacio, campo escalar y el problema de la invariancia de Lorentz"

Sin embargo, cuando visito esa URL en Firefox, obtengo

$ κ $ -Espacio de Minkowski, campo escalar y el problema de la invariancia de Lorentz

que es realmente correcto. También lo intenté

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

pero esto dio el mismo problema.

No estoy seguro de dónde está la culpa. ¿El feed miente acerca de estar codificado en UTF8 y el navegador es lo suficientemente inteligente como para darse cuenta de eso, pero no WebClient? ¿El feed está codificado correctamente en UTF8, pero WebClientfalla de alguna otra manera? ¿Qué puedo hacer para mitigar esto?


6
UTF8Encoding.Defaultes en realidad Encoding.Default, que es la codificación ANSI basada en la configuración de idioma del sistema operativo.
svick

Respuestas:


201

No es mentira. Primero debe configurar la codificación del cliente web antes de llamar a 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");
}

En cuanto a por qué su alternativa no funciona, es porque el uso es incorrecto. Debe ser:

System.Text.Encoding.UTF8.GetString()

9
¡Excelente gracias! Es extraño que WebClientno use los encabezados para detectar esto, pero esto funciona perfectamente, y entre usted y @svick, entiendo por qué la otra cosa que intenté también falló miserablemente.
Domenic

1
Obras para UploadStringasí
irfandar
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.