2010-09-23 3 views
42

Est-ce que toutes les fonctions en C# traitent escape/unescape comme JavaScript?Détruit l'échappement de JavaScript() en utilisant C#

J'ai une chaîne JSON comme ceci:

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

qui ressemble à ceci après 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

Dans mon code C# Je voudrais Unescape cette chaîne afin qu'elle ressemble exactement le même que ce qu'il faisait avant le escape()

Est-ce possible?

Répondre

59

HttpUtility.UrlDecode devrait faire l'affaire.

+0

@Timw Je - Tu as raison. J'ai mal lu. Actualisé. Juste par curiosité, pourquoi avez-vous roulé votre propre code (maintenant supprimé) pour faire la même chose au lieu de réutiliser ce que .NET fournit? –

+0

Thx, j'ai essayé 'HttpUtility.HtmlDecode' mais cela n'a pas fonctionné, mais quand je vois votre réponse, je vois que' UrlDecode' fait quelque chose que 'HtmlDecode' n'a pas fait. – Martin

+0

@Martin - Oui. 'HtmlDecode' est pour décoder les caractères HTML échappés. L'encodage d'URL implique plus de règles. –

15

escape() est équivalent à

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

Par défaut, le UrlDecode utilise UTF8 alors que escape() ne le font pas.

+0

UTF8 est rétrocompatible avec ASCII donc, à moins que je ne comprenne quelque chose, vous ne devriez pas avoir à passer l'encodage. –

+0

Ceci est faux ... escape() est en fait équivalent à 'HttpUtility.UrlDecode (str, Encoding.Default)', ce qui signifie deux choses: ① cela dépend des paramètres régionaux de votre système; et ② il est obsolète des années 90 technologie 8 bits et incompatible avec UTF-8. (Le deuxième paragraphe est correct cependant.) – Timwi

+0

@Justin Niessner: Comme vous l'avez dit, il est rétrocompatible 'compatible'. Pas équivalent. Et je veux mettre l'accent sur «en arrière», ne pense même pas que c'est compatible dans l'autre sens. – BrunoLM

5

Ah mec, pourquoi avons-nous trop de choses parfois? Lorsqu'une fonction API est stupide, envoyer un CUSS karma au développeur de la bibliothèque, puis travailler à tout autour ...

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

J'ai passé 8 heures à essayer d'obtenir

HttpUtility.UrlDecode 

au travail, et abandonné et utilisé

HttpUtility.HtmlDecode 

qui a fonctionné instantanément.

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

Pour unescape sans avoir à faire référence System.Web afin d'utiliser HttpUtility, essayez ceci:

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

Aussi, quand j'ai essayé HttpUtility.UrlDecode, il ne fonctionne pas pour les caractères spéciaux et aacute ; & eacute; & iacute; & eacute; & uacute; & ntilde ;.

9

C'est la meilleure façon de fonctionner avec de celles-ci:

Encode en C#:

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

Decode en JavaScript:

decodeURI("<string>"); 

Encode en JavaScript:

encodeURI("<string>"); 

Décoder dans C#:

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

Mise à jour 27-Jan-2016: Juste trouvé ce qui semble ne pas être un moyen de faire plus compatible, ce qui code aussi le protocole URI (http: //) en utilisant javascript:

Encode en JavaScript:

encodeURIComponent("<string>"); 

Decode en JavaScript:

decodeURIComponent("<string>");