2008-10-27 23 views
33

¿Hay alguna función que convierta una cadena Url escapada a su forma no escapada? System.Web.HttpUtility.UrlDecode() puede hacer ese trabajo, pero no quiero agregar una referencia al System.Web.dll. Como mi aplicación no es una aplicación web, no deseo agregar una dependencia solo para usar una función en un ensamblaje.Decodificar url escapado sin utilizar HttpUtility.UrlDecode

ACTUALIZACIÓN: Compruebe Rick Strahl's blog post sobre el mismo problema.

+1

La publicación de Rick Strahl es una lectura obligada: contiene los antecedentes necesarios y un análisis en profundidad de las diferentes soluciones que el .NET framework ofrece (o no ofrece). – Oliver

+0

Posible duplicado de [¿Cómo decodificar un parámetro de URL usando C#?] (Http://stackoverflow.com/questions/1405048/how-do-i-decode-a-url-parameter-using-c) –

Respuesta

58

EDIT: Utilice el método estático Uri.UnescapeDataString() para decodificar URL:

codificados:http%3a%2f%2fwww.google.com%2fsearch%3fhl%3den%26q%3dsomething%20%2323%26btnG%3dGoogle%2bSearch%26aq%3df%26oq%3d

decodificado:http://www.google.com/search?hl=en&q=something #23&btnG=Google+Search&aq=f&oq=

+0

este dosto no me funciona, simplemente devuelve el pase de cadena original a 'Uri.UnescapeDataString (myurl)' – Smith

+6

Cuidado: Esto no funciona para los signos más - http://blogs.msdn.com/b/ yangxind/archive/2006/11/09/don-t-use-net-system-uri-unescapedatastring-in-url-decoding.aspx Todavía estoy buscando un mejor método. –

+2

@Chris: Rick Strahl construyó una clase de utilidad alrededor de 'Uri.UnescapeDataString()' que maneja los signos '+' correctamente. Ver [su publicación en el blog] (http://www.west-wind.com/weblog/posts/617930.aspx) para más detalles. – Oliver

0

El equipo de Microsoft ACE tiene una versión extendida (y mejor) de la decodificación, en el Anti-XSS library. Sin embargo, no estoy seguro si solo pasa.

(no veo por qué estás tan preocupado por la dependencia de System.web.dll para ser honesto)

+0

El motivo es que no quiero cargar una DLL bastante grande en mi espacio de memoria por el solo hecho de llamar a un solo método. Sería bueno si alguien señala una implementación (probablemente usa Regex) que puedo copiar/pegar en mi proyecto. – huseyint

+0

Una solución de expresiones regulares no será suficiente; la decodificación es * difícil *. Si realmente está preocupado, * tos *, reflector. ¿Ha analizado realmente el costo de la memoria de cargar el conjunto? Probablemente no sea tan grande como piensas. – blowdart

+1

Tenga en cuenta que las diferentes versiones de framework (especialmente el "perfil de cliente") son una razón válida para evitarlo, pero no vale la pena * * emocionarse con esto; - p –

0

usted ya tiene una dependencia enorme en el marco .NET, CLR et al. Entonces, de hecho, usted ya tiene una dependencia indirecta de System.Web.DLL; su aplicación NO PUEDE EJECUTAR sin su presencia en la máquina local.

¿Y le preocupa la memoria? ¿Tienes problemas de memoria? Si tiene problemas de memoria tan extremos que no puede cargar un par de KB de DLL en la memoria de su aplicación, ¿por qué está codificando .NET? ¿O solo estás optimizando prematuramente?

Así que no te preocupes por eso.

+5

Su afirmación es incorrecta; "perfil de cliente", "cf" y "silverlight" carecerán de System.Web.dll; "perfil de cliente" es una versión de .NET regular, por lo que es el más llamativo. –

+1

@marc iirc cuando esto fue respondido, los perfiles del cliente no fueron publicados/comúnmente conocidos. En segundo lugar, no dice qué tipo de aplicación, y de hecho, por la forma en que hace la pregunta, es obvio que es una opción para hacer referencia a system.web.dll. De lo contrario, la pregunta es discutible. Entonces mi afirmación es muy correcta. Nyah. – Will

4

Re no cargando System.Web.dll - como otros han notado, no vale la pena entusiasmarse a menos que sepa que debe tratar con clientes que podrían no tenerlo ("perfil de cliente", "marco compacto" , "micro framework", "silverlight").

Re espacio; no será mucho realmente; tenga en cuenta que los ensamblados .NET están JITted método por método, por lo que no habrá una sobrecarga significativa solo por usar algunos métodos.

El problema real (IMO) es su nivel de confianza de que el cliente tiene System.Web.dll; si está contento de que estén usando el marco completo, entonces solo haga lo posible.

+0

System.Web.dll es * muy * pesado, con * notable * impacto de inicio. –

+0

@ComputerLinguist roll on vNext, ¿eh? –

+0

¿No ha aparecido nada más en 7 años? Quiero decir, va a tener que vNext. –

0

@Smith
que estaba teniendo la guardar problema. Sin cambios o más confusión.

Después de probar muchas cosas noté que una cadena de prueba se decodificó. Finalmente tuve que crear una nueva cadena vacía, establecer su valor para la cadena codificada y luego ejecutar WebUtility.HtmlDecode y Uri.UnescapeDataString en la nueva cadena. Por alguna razón, tuve que ejecutar la decodificación y el escape en el orden que mencioné. Extraño.

Lo resolví con algo como esto.

Dim strEncoded as string="http%3a%2f%2fwww.google.com%2fsearch%3fhl%3den%26q%3dsomething%20%2323%26btnG%3dGoogle%2bSearch%26aq%3df%26oq%3d" 

Dim strDecoded as string = "" 
strDecoded = strEncoded 
strDecoded = WebUtility.HtmlDecode(strDecoded) 
strDecoded = Uri.UnescapeDataString(strDecoded) 
-2

System.Net.WebUtility.HtmlDecode también está trabajando en .NET 4.0 Client Profile.

+2

Url endcoding/decoding! = Codificación/decodificación Html. –

5

Si está utilizando .NET 4.0 o posterior, puede usar WebUtility.UrlDecode que funciona con el perfil del cliente y también procesa correctamente los signos más (consulte la discusión this).

Cuestiones relacionadas