C# ha un equivalente a encodeURIComponent() di JavaScript?
-
01-07-2019 - |
Domanda
In JavaScript:
encodeURIComponent("©√") == "%C2%A9%E2%88%9A"
Esiste un equivalente per le applicazioni C#?Per l'escape dei 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])));
Ritorna "%a9%221a"
per "©√"
invece di "%C2%A9%E2%88%9A"
.Sembra che debba dividere la stringa in byte o qualcosa del genere.
Modificare:Questo è per un'app Windows, gli unici elementi disponibili in System.Web
Sono: AspNetHostingPermission
, AspNetHostingPermissionAttribute
, E AspNetHostingPermissionLevel
.
Soluzione
Uri.EscapeDataString
O HttpUtility.UrlEncode
è il modo corretto per eseguire l'escape di una stringa destinata a far parte di un URL.
Prendiamo 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 (a differenza del valore di uno dei parametri della stringa di query)
Altri suggerimenti
HttpUtility.HtmlEncode
/ Decodifica
HttpUtility.UrlEncode
/ Decodifica
È possibile aggiungere un riferimento a System.Web
assembly se non è disponibile nel tuo progetto
Ho provato a fare un analogo completamente compatibile con encodeURIComponent di Javascript per C# e dopo i miei esperimenti di 4 ore ho trovato questo
c#CODICE:
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%20testo%20qui%20%d0%b0%d0%bb%d0%b8%20%d0%bc%d0%b0% d0%bc%d0%b5%d0%b4%d0%be%d0%b2%20%d0%b1%d0%b0%d0%ba%d1%83
Dopo averlo decodificato con decodeURLComponent();
otterrai questo:!@#$%^&*()_+ del testo qui али мамедов баку
Grazie per l'attenzione
System.Uri.EscapeUriString() non sembrava fare nulla, ma System.Uri.EscapeDatiString() ha funzionato per me.
Tentativo Server.UrlEncode()
, O System.Web.HttpUtility.UrlEncode()
per i casi in cui non hai accesso a Server
oggetto.Puoi anche usare System.Uri.EscapeUriString()
per evitare di aggiungere un riferimento a System.Web
assemblaggio.
È possibile utilizzare l'oggetto Server nello spazio dei nomi System.Web
Server.UrlEncode, Server.UrlDecode, Server.HtmlEncode e Server.HtmlDecode.
Modificare:poster ha aggiunto che si trattava di un'applicazione Windows e non web come si potrebbe credere.Gli elementi sopra elencati sarebbero disponibili dalla classe HttpUtility all'interno di System.Web che deve essere aggiunta come riferimento al progetto.
Per un'app di Windows Store, non avrai HttpUtility.Invece hai:
Per un URI, prima di "?":
- Sistema.Uri.EscapeUriString("esempio.com/Stack Overflow++?")
- -> "esempio.com/Stack%20Overflow++?"
Per il nome o il valore di una query URI, dopo "?":
- Sistema.Uri.EscapeDataString("Stack Overflow++")
- -> "Stack%20Overflow%2B%2B"
Per un x-www-form-urlencoded nome o valore della query, in un contenuto POST:
- System.Net.WebUtility.UrlEncode("Stack Overflow++")
- -> "Stack+Overflow%2B%2B"