example escapeuristring escapedatastring c# .net urlencode .net-client-profile

escapeuristring - urldecode c#



¿Cómo se UrlEncode sin usar System.Web? (8)

Estoy tratando de escribir una aplicación de cliente de Windows que llame a un sitio web para obtener datos. Para mantener la instalación al mínimo, solo intento usar dlls en el perfil de cliente de .NET Framework . El problema es que necesito UrlEncode algunos parámetros, ¿hay una manera fácil de hacer esto sin importar System.Web.dll que no es parte del perfil de cliente?



En .Net 4.5+ use WebUtility

Solo para formatear estoy enviando esto como una respuesta.

No se pudo encontrar ningún buen ejemplo comparándolos así que:

string testString = "http://test# space 123/text?var=val&another=two"; Console.WriteLine("UrlEncode: " + System.Web.HttpUtility.UrlEncode(testString)); Console.WriteLine("EscapeUriString: " + Uri.EscapeUriString(testString)); Console.WriteLine("EscapeDataString: " + Uri.EscapeDataString(testString)); Console.WriteLine("EscapeDataReplace: " + Uri.EscapeDataString(testString).Replace("%20", "+")); Console.WriteLine("HtmlEncode: " + System.Web.HttpUtility.HtmlEncode(testString)); Console.WriteLine("UrlPathEncode: " + System.Web.HttpUtility.UrlPathEncode(testString)); //.Net 4.0+ Console.WriteLine("WebUtility.HtmlEncode: " + WebUtility.HtmlEncode(testString)); //.Net 4.5+ Console.WriteLine("WebUtility.UrlEncode: " + WebUtility.UrlEncode(testString));

Salidas:

UrlEncode: http%3a%2f%2ftest%23+space+123%2ftext%3fvar%3dval%26another%3dtwo EscapeUriString: http://test#%20space%20123/text?var=val&another=two EscapeDataString: http%3A%2F%2Ftest%23%20space%20123%2Ftext%3Fvar%3Dval%26another%3Dtwo EscapeDataReplace: http%3A%2F%2Ftest%23+space+123%2Ftext%3Fvar%3Dval%26another%3Dtwo HtmlEncode: http://test# space 123/text?var=val&another=two UrlPathEncode: http://test#%20space%20123/text?var=val&another=two //.Net 4.0+ WebUtility.HtmlEncode: http://test# space 123/text?var=val&another=two //.Net 4.5+ WebUtility.UrlEncode: http%3A%2F%2Ftest%23+space+123%2Ftext%3Fvar%3Dval%26another%3Dtwo

En .Net 4.5+ use WebUtility .UrlEncode

Esto parece replicar HttpUtility.UrlEncode (pre-v4.0) para los caracteres más comunes:
Uri.EscapeDataString(testString).Replace("%20", "+").Replace("''", "%27").Replace("~", "%7E")
Nota: EscapeUriString mantendrá una cadena uri válida, lo que hace que use tantos caracteres de texto plano como sea posible.

Vea esta respuesta para una tabla que compara las diversas codificaciones:
https://.com/a/11236038/555798

Saltos de línea Todos ellos enumerados aquí (excepto HttpUtility.HtmlEncode ) convertirán "/n/r" en %0a%0d o %0A%0D

Por favor, siéntase libre de editar esto y agregar nuevos caracteres a mi cadena de prueba, o déjelos en los comentarios y los editaré.


Este es un ejemplo de envío de una solicitud POST que codifica correctamente los parámetros utilizando el tipo de contenido application/x-www-form-urlencoded :

using (var client = new WebClient()) { var values = new NameValueCollection { { "param1", "value1" }, { "param2", "value2" }, }; var result = client.UploadValues("http://foo.com", values); }


Hay una versión utilizable de perfil de cliente, clase System.Net.WebUtility, presente en el perfil de cliente System.dll. Aquí está el enlace de MSDN:

WebUtility


Las respuestas aquí son muy buenas, pero aún insuficientes para mí.

Escribí un pequeño bucle que compara Uri.EscapeUriString con Uri.EscapeDataString para todos los caracteres de 0 a 255.

NOTA: Ambas funciones tienen la inteligencia integrada de que los caracteres superiores a 0x80 se codifican primero en UTF-8 y luego se codifican en porcentaje.

Aquí está el resultado:

******* Different ******* ''#'' -> Uri "#" Data "%23" ''$'' -> Uri "$" Data "%24" ''&'' -> Uri "&" Data "%26" ''+'' -> Uri "+" Data "%2B" '','' -> Uri "," Data "%2C" ''/'' -> Uri "/" Data "%2F" '':'' -> Uri ":" Data "%3A" '';'' -> Uri ";" Data "%3B" ''='' -> Uri "=" Data "%3D" ''?'' -> Uri "?" Data "%3F" ''@'' -> Uri "@" Data "%40" ******* Not escaped ******* ''!'' -> Uri "!" Data "!" '''''' -> Uri "''" Data "''" ''('' -> Uri "(" Data "(" '')'' -> Uri ")" Data ")" ''*'' -> Uri "*" Data "*" ''-'' -> Uri "-" Data "-" ''.'' -> Uri "." Data "." ''_'' -> Uri "_" Data "_" ''~'' -> Uri "~" Data "~" ''0'' -> Uri "0" Data "0" ..... ''9'' -> Uri "9" Data "9" ''A'' -> Uri "A" Data "A" ...... ''Z'' -> Uri "Z" Data "Z" ''a'' -> Uri "a" Data "a" ..... ''z'' -> Uri "z" Data "z" ******* UTF 8 ******* ..... ''Ò'' -> Uri "%C3%92" Data "%C3%92" ''Ó'' -> Uri "%C3%93" Data "%C3%93" ''Ô'' -> Uri "%C3%94" Data "%C3%94" ''Õ'' -> Uri "%C3%95" Data "%C3%95" ''Ö'' -> Uri "%C3%96" Data "%C3%96" .....

EscapeUriString se utilizará para codificar URL, mientras que EscapeDataString se utilizará para codificar, por ejemplo, el contenido de una cookie, porque los datos de las cookies no deben contener los caracteres reservados ''='' y '';'' .



System.Uri.EscapeUriString() puede ser problemático con ciertos caracteres, para mí era un signo de número / libra ''#'' en la cadena.

Si eso es un problema para ti, prueba:

System.Uri.EscapeDataString() //Works excellent with individual values

Aquí hay una respuesta de la pregunta SO que explica la diferencia:

¿Cuál es la diferencia entre EscapeUriString y EscapeDataString?

y recomienda utilizar Uri.EscapeDataString() en cualquier aspecto.


System.Net.WebUtility.HtmlDecode