2012-10-15 8 views
7

Come faccio a decodificare una stringa simile alla seguente:decodifica per cento-stringa codificata in C# .NET

nome1 = ABC & userid = DEF & nome2 = zyx & payload =% 3cSTAT + xmlns% 3axsi% 3d% 22http% 3a% 2f% 2fwww.w3.org% 2f2001% 2fXMLSchema-istanza% 22% 3e% 3cREQ ...

Contesto: Accetto un POST HTTP (coppie di valori nome, in pratica) quindi converte l'array di byte in stringa con:

Encoding.UTF8.GetString(response, 0, response.Length); 

Ho provato l'HtmlD metodo di ecode di WebUtility e HttpUtility, ma sembrano recuperare la stessa stringa.

risposta

17

Questo dovrebbe fare il lavoro per voi:

System.Uri.UnescapeDataString(str) 
+0

Grazie a tutti. Entrambe le risposte mi portano dove devo andare! Esistono pro/contro particolari del metodo Uri rispetto al metodo HttpUtility? –

+0

Uri ti permetterà di escludere System.Web dai tuoi riferimenti se non ne hai bisogno in altro modo. –

+1

@JohnSpiegel: Sì, c'è una sottile differenza, vedi la mia risposta modificata. –

8

Hai provato HttpUtility.UrlDecode?

Vedere here.

Si noti che questa funzione non fa esattamente la stessa cosa di HttpUtility.HtmlDecode.

Edit: In risposta alla domanda sulle differenze tra UrlDecode e UnescapeDataString:

per citare il MSDN page su UnescapeDataString:

Molti browser Web sfuggono spazi all'interno di URI in più ("+") personaggi; tuttavia, il metodo UnescapeDataString non converte più caratteri in spazi perché questo comportamento non è standard in tutti gli schemi URI.

UrlDecode consente di gestire questi, però, si ottiene risposte diverse se si tenta il seguente:

string a = Uri.UnescapeDataString(".Net+Framework"); //returns ".Net+Framework" 
string b = HttpUtility.UrlDecode(".Net+Framework"); //returns ".Net Framework" 

Pertanto sembrerebbe che, per una migliore copertura, HttpUtility.UrlDecode è l'opzione migliore.

2
var result = System.Web.HttpUtility.UrlDecode("name1=ABC&userId=DEF&name2=zyx&payload=%3cSTAT+xmlns%3axsi%3d%22http%3a%2f%2fwww.w3.org%2f2001%2fXMLSchema-instance%22%3e%3cREQ..."); 

name1=ABC&userId=DEF&name2=zyx&payload=<STAT xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><REQ... 

e mi aspetto che è quello che si desidera.

Problemi correlati