2010-09-23 26 views
42

¿Son las funciones en C# que manejan escape/unescape como JavaScript?Unescape escape de JavaScript() usando C#

que tienen una cadena JSON como esto:

{"Feeds":[{"Url":"www.test.com","FeedType":"Twitter"},{"Url":"www.test2.com","FeedType":"Youtube"}]}

que se parece a esto después de escape()

%7B%22Feeds%22%3A%5B%7B%22Url%22%3A%22www.test.com%22%2C%22FeedType%22%3A%22Twitter%22%7D%2C%7B%22Url%22%3A%22www.test2.com%22%2C%22FeedType%22%3A%22Youtube%22%7D%5D%7D

En mi código C# me gustaría unescape esta cadena para que se ve exactamente igual que antes del escape()

¿Es esto posible?

Respuesta

59

HttpUtility.UrlDecode debería hacer el truco.

+0

@Timw Yo - Estás en lo correcto. Leí mal. Actualizado. Solo por curiosidad, ¿por qué sacaste tu propio código (ahora eliminado) para hacer lo mismo en lugar de volver a usar lo que proporciona .NET? –

+0

Thx, probé 'HttpUtility.HtmlDecode', pero no funcionó, pero cuando veo su respuesta veo que' UrlDecode' hace algo que 'HtmlDecode' no hace. – Martin

+0

@Martin - Sí. 'HtmlDecode' es para decodificar caracteres HTML escapados. La codificación de URL implica más reglas. –

15

escape() es equivalente a

HttpUtility.UrlDecode(str, System.Text.Encoding.Default); 

Por defecto, el UrlDecode utiliza UTF8 mientras escape() no.

+0

UTF8 es compatible con ASCII por lo que, a menos que esté entendiendo mal algo, no debería tener que pasar la codificación. –

+0

Esto está mal ... escape() es en realidad equivalente a 'HttpUtility.UrlDecode (str, Encoding.Default)', lo que significa dos cosas: ① depende de la configuración regional de su sistema; y ② es una tecnología obsoleta de los años 90 de 8 bits e incompatible con UTF-8. (El segundo párrafo es correcto). – Timwi

+0

@Justin Niessner: Como dijiste, es 'compatible' hacia atrás. No es equivalente. Y quiero enfatizar 'hacia atrás', ni siquiera creo que sea compatible para el otro lado. – BrunoLM

5

Aw hombre, ¿por qué a veces pensamos demasiado cosas? Cuando una función API es ser tonto, enviar un cuss karma en el desarrollador de la biblioteca, entonces trabajar a su alrededor ...

HttpUtility.UrlEncode(editext, System.Text.Encoding.Default).Replace("+","%20"); 
0

yo pasamos 8 horas tratando de conseguir

HttpUtility.UrlDecode 

a trabajar, y renunció y utilizó

HttpUtility.HtmlDecode 

que funcionó al instante.

2
internal static string UnJavascriptEscape(string s) 
    { 
     // undo the effects of JavaScript's escape function 
     return HttpUtility.UrlDecode(s.Replace("+", "%2b"), Encoding.Default); 
    } 
1

Para unescape sin tener que hacer referencia a System.Web con el fin de utilizar HttpUtility, intente esto:

Str = Str.Replace("+", " "); 
Str = Regex.Replace(Str, "%([A-Fa-f\\d]{2})", a => "" + Convert.ToChar(Convert.ToInt32(a.Groups[1].Value, 16))); 

Además, cuando traté HttpUtility.UrlDecode, que no funcionaba para los caracteres & aacute especiales ; & eacute; iacute; & oacute; & uacute; & ntilde ;.

9

Ésta es la mejor manera que he encontrado para trabajar con ellos:

Codificar en C#:

System.Uri.EscapeDataString("<string>"); 

Decode en JavaScript:

decodeURI("<string>"); 

Codificar en JavaScript:

encodeURI("<string>"); 

Decodificar C#:

System.Uri.UnescapeDataString("<string>"); 

Actualización 27-Ene-2016: Sólo encontró lo que parece hacer una forma más compatible para hacerlo, que también codifica el protocolo URI (http: //) usando javascript:

Codificar en JavaScript:

encodeURIComponent("<string>"); 

Decode en JavaScript:

decodeURIComponent("<string>"); 
Cuestiones relacionadas