¿C# tiene un equivalente a encodeURIComponent() de JavaScript?
-
01-07-2019 - |
Pregunta
En JavaScript:
encodeURIComponent("©√") == "%C2%A9%E2%88%9A"
¿Existe un equivalente para las aplicaciones C#?Para escapar de caracteres HTML utilicé:
txtOut.Text = Regex.Replace(txtIn.Text, @"[\u0080-\uFFFF]",
m => @"&#" + ((int)m.Value[0]).ToString() + ";");
Pero no estoy seguro de cómo convertir la coincidencia al formato hexadecimal correcto que utiliza JS.Por ejemplo este código:
txtOut.Text = Regex.Replace(txtIn.Text, @"[\u0080-\uFFFF]",
m => @"%" + String.Format("{0:x}", ((int)m.Value[0])));
Devoluciones "%a9%221a"
para "©√"
en lugar de "%C2%A9%E2%88%9A"
.Parece que necesito dividir la cadena en bytes o algo así.
Editar:Esto es para una aplicación de Windows, los únicos elementos disponibles en System.Web
son: AspNetHostingPermission
, AspNetHostingPermissionAttribute
, y AspNetHostingPermissionLevel
.
Solución
Uri.EscapeDataString
o HttpUtility.UrlEncode
es la forma correcta de escapar de una cadena destinada a ser parte de una URL.
Tomemos por ejemplo la cadena "Stack Overflow"
:
HttpUtility.UrlEncode("Stack Overflow")
-->"Stack+Overflow"
Uri.EscapeUriString("Stack Overflow")
-->"Stack%20Overflow"
Uri.EscapeDataString("Stack + Overflow")
--> También codifica"+" to "%2b"
---->Stack%20%2B%20%20Overflow
Sólo el último es correcto cuando se utiliza como parte real de la URL (a diferencia del valor de uno de los parámetros de la cadena de consulta).
Otros consejos
HttpUtility.HtmlEncode
/ Decodificar
HttpUtility.UrlEncode
/ Decodificar
Puedes agregar una referencia a la System.Web
ensamblaje si no está disponible en su proyecto
Intenté hacer un análogo totalmente compatible del encodeURIComponent de JavaScript para C# y después de mis experimentos de 4 horas encontré esto
C# CÓDIGO:
string a = "!@#$%^&*()_+ some text here али мамедов баку";
a = System.Web.HttpUtility.UrlEncode(a);
a = a.Replace("+", "%20");
el resultado es:!%40%23%24%25%5e%26*()_%2b%20some%20text%20aquí%20%d0%b0%d0%bb%d0%b8%20%d0%bc%d0%b0% d0%bc%d0%b5%d0%b4%d0%be%d0%b2%20%d0%b1%d0%b0%d0%ba%d1%83
Después de decodificarlo con decodeURLComponent() de Javascript;
obtendrás esto:!@#$%^&*()_+ algo de texto aquí али мамедов баку
Gracias por su atención
System.Uri.EscapeUriString() no pareció hacer nada, pero System.Uri.EscapeDatosString() funcionó para mí.
Intentar Server.UrlEncode()
, o System.Web.HttpUtility.UrlEncode()
para los casos en los que no tienes acceso a la Server
objeto.También puedes usar System.Uri.EscapeUriString()
para evitar agregar una referencia a la System.Web
asamblea.
Puede utilizar el objeto Servidor en el espacio de nombres System.Web
Servidor.UrlEncode, Servidor.UrlDecode, Servidor.HtmlEncode y Servidor.HtmlDecode.
Editar:El cartel agregó que se trataba de una aplicación de Windows y no de una web como uno podría creer.Los elementos enumerados anteriormente estarían disponibles en la clase HttpUtility dentro de System.Web, que debe agregarse como referencia al proyecto.
Para una aplicación de la Tienda Windows, no tendrá HttpUtility.En cambio, tienes:
Para un URI, antes de '?':
- Sistema.Uri.EscapeUriString("ejemplo.com/Stack Overflow++?")
- -> "ejemplo.com/Stack%20Overflow++?"
Para un nombre o valor de consulta URI, después de '?':
- Sistema.Uri.EscapeDataString("Desbordamiento de pila++")
- -> "Pila%20Desbordamiento%2B%2B"
Para x-www-formulario-urlencoded nombre o valor de la consulta, en un contenido POST:
- Sistema.Net.WebUtility.UrlEncode("Desbordamiento de pila++")
- -> "Pila+Desbordamiento%2B%2B"