2010-09-23 14 views
42

Le funzioni in C# gestiscono escape/unescape come JavaScript?Unescape JavaScript escape() utilizzando C#

Ho una stringa JSON come questo:

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

che assomiglia a questo dopo 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

Nel mio codice C# Vorrei unescape questa stringa in modo che sembra esattamente lo stesso come prima dello escape()

È possibile?

risposta

59

HttpUtility.UrlDecode dovrebbe fare il trucco.

+0

@Timw io - tu hai ragione. Ho letto male. Aggiornato. Solo per curiosità, perché hai eseguito il rollover del tuo codice (ora eliminato) per fare la stessa cosa invece di riutilizzare ciò che .NET fornisce? –

+0

Thx, ho provato 'HttpUtility.HtmlDecode' ma non ha funzionato, ma quando vedo la tua risposta vedo che' UrlDecode' fa qualcosa che 'HtmlDecode' non ha fatto. – Martin

+0

@ Martin - Sì. 'HtmlDecode' serve per decodificare caratteri HTML con escape. La codifica dell'URL implica più regole. –

15

escape() è equivalente a

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

Di default il UrlDecode utilizza UTF8 mentre escape() no.

+0

UTF8 è retrocompatibile con ASCII quindi, a meno che non mi stia capendo qualcosa, non dovresti passare la codifica. –

+0

Questo è sbagliato ... escape() è in realtà equivalente a 'HttpUtility.UrlDecode (str, Encoding.Default)', che significa due cose: ① dipende dalle impostazioni locali del sistema; e ② è obsoleta la tecnologia a 8 bit degli anni '90 e incompatibile con UTF-8. (Il secondo paragrafo è corretto però.) – Timwi

+0

@Justin Niessner: Come hai detto, è 'compatibile' a rovescio'. Non equivalente E voglio dare enfasi a "indietro", non credo nemmeno che sia compatibile nell'altro modo. – BrunoLM

5

Aw man, perché a volte pensiamo troppo a qualcosa. Quando una funzione API è essere stupido, inviare un cuss karma lo sviluppatore biblioteca, poi lavorare-intorno ad esso ...

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

Ho trascorso 8 ore a cercare di ottenere

HttpUtility.UrlDecode 

al lavoro, e ha rinunciato e utilizzato

HttpUtility.HtmlDecode 

che ha funzionato all'istante.

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

Per unescape senza dover fare riferimento System.Web al fine di utilizzare HttpUtility, provate questo:

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

Inoltre, quando ho provato HttpUtility.UrlDecode, non ha funzionato per i caratteri speciali & aacute ; & eacute; & iacute; & oacute; & uacute; & ntilde ;.

9

Questo è il modo migliore che ho trovato a lavorare con questi:

Encode in C#:

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

Decode in JavaScript:

decodeURI("<string>"); 

Encode in JavaScript:

encodeURI("<string>"); 

Decodifica in C#:

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

Aggiornamento 27-gen-2016: Appena trovato quello che sembra do essere un modo più compatibile per farlo, che codifica anche il protocollo URI (http: //) utilizzando JavaScript:

Encode in JavaScript:

encodeURIComponent("<string>"); 

Decode in JavaScript:

decodeURIComponent("<string>"); 
Problemi correlati