2008-09-17 17 views
87

En JavaScript:¿Tiene C# un equivalente al encodeURIComponent() de JavaScript?

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

¿Hay 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 el partido en el 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 tengo que dividir la cadena para arriba en bytes o algo

Editar: Se trata de una aplicación de Windows, el los elementos disponibles en System.Web son:. AspNetHostingPermission, AspNetHostingPermissionAttribute y AspNetHostingPermissionLevel

Respuesta

144

Uri.EscapeDataString o HttpUtility.UrlEncode es la forma correcta de escapar de una cadena que forma 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 última último es correcta cuando se utiliza como una parte real de la dirección URL (en comparación con el valor de uno de los parámetros de cadena de consulta)

+0

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

+42

En contraste con encodeURIComponent(), Uri.EscapeUriString() no codifica "+" a "% 2b". Use Uri.EscapeDataString() en su lugar. – jwaliszko

+0

@Steve Uri.EscapeDataString salvó nuestro día;) – InferOn

16

HttpUtility.HtmlEncode/Decode
HttpUtility.UrlEncode/Decode

Puede añadir una referencia al ensamblado System.Web si no está disponible en su proyecto

+0

que debería haber sido más específico: Se trata de una aplicación de Windows, los únicos elementos disponibles en System.Web son: AspNetHostingPermission, AspNetHostingPermissionAttribute y AspNetHostingPermissionLevel. – travis

+4

Puede agregar una referencia al ensamblado System.Web –

+0

¡Me acabo de dar cuenta de eso, gracias! – travis

5

Puede utilizar el objeto de 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 creería. Los elementos enumerados anteriormente estarían disponibles en la clase HttpUtility dentro de System.Web, que debe agregarse como referencia al proyecto.

+0

El objeto Servidor es inaccesible desde una aplicación de Windows – travis

9

Pruebe Server.UrlEncode(), o System.Web.HttpUtility.UrlEncode() para cuando no tenga acceso al objeto Server. También puede usar System.Uri.EscapeUriString() para evitar agregar una referencia al ensamblaje System.Web.

+1

Uri.EscapeUriString() no hizo nada por mí, pero pude codificar en la URL correctamente las cadenas usando Uri.EscapeDataString() –

+1

@TolandHon: De hecho. La razón es que 'Uri.EscapeUriString()' corresponde a 'encodeURI()' de JavaScript que conserva los caracteres reservados de URI. como '/', '&', ... as-is (más '#'), mientras que, como has descubierto, es 'Uri.EscapeDataString()' que corresponde al 'encodeURIComponent()' de JavaScript. – mklement0

9

System.Uri.EscapeUriString() no pareció hacer nada, pero System.Uri.Escape Datos String() funcionó para mí.

13

he intentado hacer analógicas compatibles llena de encodeURIComponent de Javascript para C# y después de mis experimentos de 4 horas me encontré con este

código C#:

string a = "[email protected]#$%^&*()_+ some text here али мамедов баку"; 
a = System.Web.HttpUtility.UrlEncode(a); 
a = a.Replace("+", "%20"); 

el resultado es: % 40% 23% 24% 25% 5e% 26 *() _% 2b% 20so me% 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 Javascript decodeURLComponent();

obtendrá esto:! @ # $%^& *() _ + algo de texto aquí али мамедов баку

gracias por la atención

+1

+1 por respetar la palabra" equivalente "en la pregunta. Estaba convirtiendo algunos algoritmos de JavaScript en VB.NET y esta respuesta fue útil. – Fuhrmanator

+1

Funciona, pero simplemente puede usar 'Uri.EscapeDataString ("! @ # $%^& *() _ + Texto aquí y мамедов баку ")' en su lugar. – mklement0

4

Para una tienda de aplicaciones de Windows, que ganó No tiene HttpUtility. En su lugar, usted tiene:

Para un URI, antes de que el '?':

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

Para una consulta de nombre URI o el valor, después de que el '?':

  • sistema. Uri.EscapeDataString ("desbordamiento de pila ++")
    • -> "Pila% 20Overflow% 2B% 2B"

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

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