2011-08-21 50 views
71

El siguiente código:resultados WebClient.DownloadString en caracteres destrozados debido a problemas de codificación, pero el navegador está bien

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

resultado en una variable text que contiene, entre otras muchas cosas, la cadena

"espacio Iº $ $ -Minkowski, campo escalar, y la cuestión de la invariancia de Lorentz"

Sin embargo, cuando vuelva a esa URL en FireF buey, me sale

$ κ $ -Minkowski espacio, campo escalar, y la cuestión de la invariancia de Lorentz

que es realmente correcto. También probé

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 falla. ¿La información acerca de que está siendo codificada en UTF8, y el navegador es lo suficientemente inteligente como para darse cuenta, pero no WebClient? ¿Está la alimentación correctamente codificada en UTF8, pero WebClient está fallando de alguna otra manera? ¿Qué puedo hacer para mitigar esto?

+5

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

Respuesta

156

No está mintiendo. Debe establecer primero 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. Debería ser:

System.Text.Encoding.UTF8.GetString() 
+7

Excelente, ¡gracias! Es extraño que el 'WebClient' no use los encabezados para detectar esto, pero esto funciona perfectamente, y entre usted y @svick, entiendo por qué la otra cosa que probé también estaba fallando miserablemente. – Domenic

+0

Funciona para 'UploadString' también – lostmylogin

Cuestiones relacionadas