¿C # tiene un equivalente a encodeURIComponent () de JavaScript?


135

En JavaScript:

encodeURIComponent("©√") == "%C2%A9%E2%88%9A"

¿Existe un equivalente para las aplicaciones de C #? Para escapar de los caracteres HTML que 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])));

Devuelve " %a9%221a"para en "©√"lugar de "%C2%A9%E2%88%9A". Parece que necesito dividir la cadena en bytes o algo así.

Editar: Esta es una aplicación de Windows, los únicos elementos disponibles en System.Webson: AspNetHostingPermission, AspNetHostingPermissionAttributey AspNetHostingPermissionLevel.

Respuestas:


217

Uri.EscapeDataStringo HttpUtility.UrlEncodees la forma correcta de escapar de una cadena destinada a formar parte de una URL.

Tome 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

Solo el último es correcto cuando se usa como parte real de la URL (en oposición al valor de uno de los parámetros de la cadena de consulta)


El problema principal que tenía era no tener una referencia a System.Web en mi solución, pero no estaba al tanto de EscapeUriString, ¡gracias!
travis

53
A diferencia de encodeURIComponent (), Uri.EscapeUriString () no codifica "+" a "% 2b". Utilice Uri.EscapeDataString () en su lugar.
jwaliszko

44
Use WebUtility en lugar de HttpUtility para evitar tener que hacer referencia a System.Web. HttpUtility no existe en .NET Core.
Steven De Kock

2
@ Steve ¿Considerarías poner en negrita tu último párrafo? Parece ser lo más importante que debe saber en esta página, y necesita más visibilidad.
Timo

También vea esta respuesta para obtener más explicaciones sobre la diferencia entre Uri.EscapeUriString y Uri.EscapeDataString: stackoverflow.com/questions/4396598/…
Jason

20

HttpUtility.HtmlEncode/ Decodificar
HttpUtility.UrlEncode/ Decodificar

Puede agregar una referencia al System.Webensamblaje si no está disponible en su proyecto


Debería haber sido más específico: esto es para una aplicación de Windows, los únicos elementos disponibles en System.Web son: AspNetHostingPermission, AspNetHostingPermissionAttribute y AspNetHostingPermissionLevel.
travis

55
Puede agregar una referencia al sistema. Asamblea web
David Thibault

2
HtmlEncoding es una cosa completamente diferente. UrlEncode es una API no sensorial que nunca debe usarse. No tiene sentido codificar una URL completa (a menos que realmente desee codificar su valor para usar como parámetro, pero eso no es lo que hace). El punto de codificación / escape es que está transmitiendo que se debe pasar un carácter reservado sin su significado habitual (por ejemplo, ¿eso? Identifica la consulta o separa los parámetros de la consulta). Esto requiere conocimiento que UrlEncode no tiene ni puede tener.
Brandon Paddock

18

Intenté hacer un análogo totalmente compatible de 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% 20here% 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á esto :! @ # $% ^ & * () _ + texto aquí али мамедов баку

Gracias por su atención


2
Funciona, pero simplemente puedes usarlo Uri.EscapeDataString("!@#$%^&*()_+ some text here али мамедов баку")en su lugar.
mklement0

En realidad, Uri.EscapeDataStringcodifica los caracteres '(' y ')' mientras HttpUtility.UrlEncodeque no.
Øystein Kolsrud

12

System.Uri.EscapeUriString () no parecía hacer nada, pero System.Uri.Escape Data String () funcionó para mí.


10

Intente Server.UrlEncode(), o System.Web.HttpUtility.UrlEncode()en los casos en que no tenga acceso al Serverobjeto. También puede usar System.Uri.EscapeUriString()para evitar agregar una referencia al System.Webensamblaje.


1
Uri.EscapeUriString () no hizo nada por mí, pero pude codificar correctamente las cadenas usando Uri.EscapeDataString ()
Toland Hon

3
@TolandHon: De hecho. La razón es que Uri.EscapeUriString()corresponde a JavaScript, encodeURI()que conserva los caracteres reservados por URI. tales como /, &, ... tal cual (más #), mientras que - como se ha descubierto, es Uri.EscapeDataString()que corresponde a JavaScript de encodeURIComponent().
mklement0

8

Para una aplicación de la Tienda Windows, no tendrá HttpUtility. En cambio, tienes:

Para un URI, antes del '?':

  • Sistema. Uri.EscapeUriString ("ejemplo.com/Stack Overflow ++?")
    • -> "ejemplo.com/Stack%20Overflow++?"

Para un nombre o valor de consulta URI, después del '?':

  • Sistema. Uri.EscapeDataString ("Desbordamiento de pila ++")
    • -> "Pila% 20 Desbordamiento% 2B% 2B"

Para un nombre o valor de consulta x-www-form-urlencoded , en un contenido POST:

  • System.Net. WebUtility.UrlEncode ("Desbordamiento de pila ++")
    • -> "Pila + Desbordamiento% 2B% 2B"

6

Puede usar el objeto Servidor en el espacio de nombres System.Web

Server.UrlEncode, Server.UrlDecode, Server.HtmlEncode y Server.HtmlDecode.

Editar: el póster agregó que se trataba de una aplicación de Windows y no de una web como se 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.


1
El objeto de servidor es inaccesible desde una aplicación de Windows
Travis
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.