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?
A UrlEncode sin usar System.Web:
String s = System.Net.WebUtility.UrlEncode(str);
//fix some different between WebUtility.UrlEncode and HttpUtility.UrlEncode
s = Regex.Replace(s, "(%[0-9A-F]{2})", c => c.Value.ToLowerInvariant());
más detalles: https://www.samnoble.co.uk/2014/05/21/beware-webutility-urlencode-vs-httputility-urlencode/
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:
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 '';''
.
Puedes usar
Uri.EscapeUriString (consulte http://msdn.microsoft.com/en-us/library/system.uri.escapeuristring.aspx )
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