C # ha un equivalente a encodeURIComponent () di JavaScript?


135

In JavaScript:

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

Esiste un equivalente per le applicazioni C #? Per sfuggire ai caratteri HTML ho usato:

txtOut.Text = Regex.Replace(txtIn.Text, @"[\u0080-\uFFFF]",
    m => @"&#" + ((int)m.Value[0]).ToString() + ";");

Ma non sono sicuro di come convertire la corrispondenza nel formato esadecimale corretto utilizzato da JS. Ad esempio questo codice:

txtOut.Text = Regex.Replace(txtIn.Text, @"[\u0080-\uFFFF]",
    m => @"%" + String.Format("{0:x}", ((int)m.Value[0])));

Restituisce " %a9%221a"per "©√"anziché "%C2%A9%E2%88%9A". Sembra che debba dividere la stringa in byte o qualcosa del genere.

Edit: Questo è per un'applicazione di Windows, gli unici elementi disponibili in System.Websono: AspNetHostingPermission, AspNetHostingPermissionAttribute, e AspNetHostingPermissionLevel.

Risposte:


217

Uri.EscapeDataStringo HttpUtility.UrlEncodeè il modo corretto di sfuggire a una stringa destinata a far parte di un URL.

Prendi ad esempio la stringa "Stack Overflow":

  • HttpUtility.UrlEncode("Stack Overflow") -> "Stack+Overflow"

  • Uri.EscapeUriString("Stack Overflow") -> "Stack%20Overflow"

  • Uri.EscapeDataString("Stack + Overflow")-> Codifica anche "+" to "%2b"---->Stack%20%2B%20%20Overflow

Solo l'ultimo è corretto se utilizzato come parte effettiva dell'URL (al contrario del valore di uno dei parametri della stringa di query)


Il problema principale che stavo riscontrando non era avere un riferimento a System.Web nella mia soluzione, ma non ero a conoscenza di EscapeUriString, grazie!
Travis,

53
A differenza di encodeURIComponent (), Uri.EscapeUriString () non codifica "+" in "% 2b". Utilizzare invece Uri.EscapeDataString ().
jwaliszko,

4
Utilizzare WebUtility anziché HttpUtility per evitare di fare riferimento a System.Web. HttpUtility non esiste in .NET Core.
Steven De Kock,

2
@Steve Considereresti di rendere audace il tuo ultimo paragrafo? Sembra essere la cosa più importante da sapere in questa pagina e necessita di maggiore visibilità.
Timo,

Si veda anche questa risposta maggiori spiegazioni sulla differenza tra Uri.EscapeUriString e Uri.EscapeDataString: stackoverflow.com/questions/4396598/...
Jason

20

HttpUtility.HtmlEncode/ Decodifica
HttpUtility.UrlEncode/ Decodifica

È possibile aggiungere un riferimento System.Weball'assembly se non è disponibile nel progetto


Avrei dovuto essere più specifico: questo è per un'app di Windows, gli unici elementi disponibili in System.Web sono: AspNetHostingPermission, AspNetHostingPermissionAttribute e AspNetHostingPermissionLevel.
travis,

5
È possibile aggiungere un riferimento all'assembly System.Web
David Thibault,

2
HtmlEncoding è una cosa completamente diversa. UrlEncode è un'API non sensibile che non dovrebbe mai essere utilizzata. Non ha senso codificare un intero URL (a meno che tu non voglia effettivamente codificare il suo valore da utilizzare come parametro - ma non è quello che fa). Il punto di codifica / escape è che stai comunicando che un carattere riservato deve essere passato senza il suo significato abituale (ad esempio, che identifica la query o separa i parametri della query). Ciò richiede la conoscenza che UrlEncode non ha e non può avere.
Brandon Paddock,

18

Ho provato a fare un analogo pienamente compatibile del componente encodeURIC di javascript per c # e dopo i miei esperimenti di 4 ore ho trovato questo

CODICE c #:

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

il risultato è: !% 40% 23% 24% 25% 5e% 26 * () _% 2b% 20some% 20text% 20here% 20% d0% b0% d0% bb% d0% b8% 20% d0% bc% d0% b0% D0% bc% D0% b5% D0% b4% D0% essere% D0% b2% 20% D0% b1% D0% b0% D0% ba% d1% 83

Dopo averlo decodificato con decodeURLComponent () di Javascript;

otterrai questo :! @ # $% ^ & * () _ + del testo qui али мамедов баку

Grazie per l'attenzione


2
Funziona, ma puoi semplicemente usare Uri.EscapeDataString("!@#$%^&*()_+ some text here али мамедов баку")invece.
mklement0

In realtà, Uri.EscapeDataStringcodifica i caratteri '(' e ')' mentre HttpUtility.UrlEncodenon lo è.
Øystein Kolsrud,

12

System.Uri.EscapeUriString () non sembrava fare nulla, ma System.Uri.Escape Data String () ha funzionato per me.


10

Prova Server.UrlEncode()o, System.Web.HttpUtility.UrlEncode()per esempio, quando non hai accesso Serverall'oggetto. È inoltre possibile utilizzare System.Uri.EscapeUriString()per evitare l'aggiunta di un riferimento System.Weball'assembly.


1
Uri.EscapeUriString () non ha fatto nulla per me, ma sono stato in grado di codificare correttamente le stringhe usando Uri.EscapeDataString ()
Toland Hon

3
@TolandHon: Davvero. Il motivo è che Uri.EscapeUriString()corrisponde a JavaScript, encodeURI()che conserva i caratteri riservati agli URI. come ad esempio /, &... così come sono (più #), mentre - come hai scoperto, è Uri.EscapeDataString()che corrisponde a JavaScript encodeURIComponent().
mklement0

8

Per un'app di Windows Store, non avrai HttpUtility. Invece, hai:

Per un URI, prima del '?':

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

Per un nome o valore di una query URI, dopo '?':

  • Sistema. Uri.EscapeDataString ("Stack Overflow ++")
    • -> "Stack% 20 Overflow% 2B% 2B"

Per un nome o valore di query con codice url x-www , in un contenuto POST:

  • System.Net. WebUtility.UrlEncode ("Stack Overflow ++")
    • -> "Stack + Overflow% 2B% 2B"

6

È possibile utilizzare l'oggetto Server nello spazio dei nomi System.Web

Server.UrlEncode, Server.UrlDecode, Server.HtmlEncode e Server.HtmlDecode.

Modifica: il poster ha aggiunto che si trattava di un'applicazione Windows e non di una Web come si potrebbe credere. Gli elementi sopra elencati sarebbero disponibili dalla classe HttpUtility all'interno di System.Web che deve essere aggiunto come riferimento al progetto.


1
L'oggetto Server non è accessibile da un'app di Windows
travis,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.