2011-12-16 17 views
5

Tengo Url con espacio y me gustaría reemplazar espacios con% 20 (escapar de ellos). UrlPathEncode debería hacer eso, pero no funciona en la URL debajo de la que tiene espacios. ¿Alguien puede explicar por qué no está funcionando?UrlPathEncode no escapa espacios

System.Web.HttpUtility.UrlPathEncode("http://a1.quickcatchlabs.com/phototemplates/football_blimp_1.html?i_url=http://lh3.ggpht.com/yf5lVBB_WNBvBHT1HoIzY1SG0-PY5zRCobP3vBacuSk9N346F7CeAIRSFOltR6ZC1-yf-MNKAcAd7bAZ_A=s612-c&i_name=Patriots vs Redskins&i_venue_name=Gillette Stadium &i_venue_address=Foxborough , MA&d_Score_0=34&d_Score_1=27&d_Period_0=Final&p_name_0=Patriots &p_name_1=Redskins"); 
+2

Se trata de codificar la _path_, pero las cadenas que desea cifrados están en la string_ _query. – fge

Respuesta

8

Como su nombre lo indica, UrlPathEncode codifica el camino. Solo la ruta, no la parte de consulta de la URL. Si agrega un espacio a la ruta y ejecuta ese código nuevamente, verá que el espacio en la porción de ruta se reemplaza por un %20, pero los espacios en la porción de consulta no lo están.

Si reemplaza la llamada a UrlPathEncode con una a Uri.EscapeUriString, codificará correctamente toda la URL, no solo la ruta.

1

Debe llamar al Uri.EscapeDataString.

+0

Esa es una C#/javascript frankenlanguage, ¿no? – spender

+0

@spender: No; es un error tipográfico Fijo; Gracias. – SLaks

0
Uri.EscapeDataString("this is a test") 

da

this%20is%20a%20test 
1

En su caso, divida la cadena para '?' (Url.split ('?')). Le dará la ruta base y la cadena de consulta. Luego codifique la ruta base con UrlPathEncode() y consulte la cadena con UrlEncode(). Luego agrega ambos. Esto resolvería el problema.

Código de ejemplo:

public string EncodeURL(string url) 
{ 
    var encodedURL = new StringBuilder(); 
    var urls = url.Split('?'); 
    encodedUrl.Append(HttpUtility.UrlPathEncode(urls[0])); 
    encodedUrl.Append(HttpUtility.UrlEncode(urls[1])); 

    return encodedUrl.ToString(); 
} 
+0

Hay un problema cuando la URL contiene (no debería) más '?'. – IvanH

+0

En ese caso, use url.Split (Char [], count) y pase count = 1. Esto resolvería tu problema. – smhnkmr

+0

Este no es el problema principal según mi comprensión actual de que el código de URL escapa de la cadena de consulta como un todo y por lo tanto no se interpreta como separador cuando la cadena de consulta se interpreta correctamente en la página de aceptación. – IvanH

Cuestiones relacionadas