Wie urlencode Sie ohne System.Web zu verwenden?
-
27-09-2019 - |
Frage
Ich versuche, eine Windows-Client-Anwendung zu schreiben, die eine Website für Datenanrufe. Damit die installiert ich nur auf ein Minimum versuchen benutzen DLLs in .NET Framework Client Profil . Das Problem ist, dass ich zu UrlEncode müssen einige Parameter, gibt es einen einfachen Weg, dies zu tun, ohne System.Web.dll zu importieren, die nicht Teil des Auftraggebers Pofile ist?
Lösung
System.Uri.EscapeUriString()
kann mit bestimmten Zeichen problematisch sein, für mich war es eine Zahl / pound ‚#‘ Zeichen in der Zeichenkette.
Wenn das ein Problem für Sie, versuchen Sie:
System.Uri.EscapeDataString() //Works excellent with individual values
Hier ist eine Frage SO Antwort, die den Unterschied erklärt:
Was ist der Unterschied zwischen EscapeUriString und EscapeDataString?
und empfiehlt die Verwendung Uri.EscapeDataString()
in jedem Aspekt.
Andere Tipps
In .NET 4.5+ Verwendung https://stackoverflow.com/a/11236038/555798
Zeilenumbrüche
Alle von ihnen hier aufgelistet (außer HttpUtility.HtmlEncode
) wird "\n\r"
in %0a%0d
oder %0A%0D
Bitte fühlen Sie sich frei zu bearbeiten und neue Charaktere zu meinem Test-String hinzufügen oder sie in den Kommentaren hinterlassen und ich werde es ändern.
Sie können mit
Uri.EscapeUriString (siehe http://msdn.microsoft .com / en-us / library / system.uri.escapeuristring.aspx )
Die Antworten hier sind sehr gut, aber für mich immer noch unzureichend.
Ich schrieb eine kleine Schleife, die Uri.EscapeUriString
mit Uri.EscapeDataString
für alle Zeichen von 0 bis 255 vergleicht.
. HINWEIS: Beide Funktionen haben die eingebaute Intelligenz die Zeichen über 0x80 sind erste UTF-8 codiert und dann Prozent codiert
Hier ist das Ergebnis:
******* Different *******
'#' -> Uri "#" Data "%23"
'$' -> Uri "$" Data "%24"
'&' -> Uri "&" Data "%26"
'+' -> Uri "+" Data "%2B"
',' -> Uri "," Data "%2C"
'/' -> Uri "/" Data "%2F"
':' -> Uri ":" Data "%3A"
';' -> Uri ";" Data "%3B"
'=' -> Uri "=" Data "%3D"
'?' -> Uri "?" Data "%3F"
'@' -> Uri "@" Data "%40"
******* Not escaped *******
'!' -> Uri "!" Data "!"
''' -> Uri "'" Data "'"
'(' -> Uri "(" Data "("
')' -> Uri ")" Data ")"
'*' -> Uri "*" Data "*"
'-' -> Uri "-" Data "-"
'.' -> Uri "." Data "."
'_' -> Uri "_" Data "_"
'~' -> Uri "~" Data "~"
'0' -> Uri "0" Data "0"
.....
'9' -> Uri "9" Data "9"
'A' -> Uri "A" Data "A"
......
'Z' -> Uri "Z" Data "Z"
'a' -> Uri "a" Data "a"
.....
'z' -> Uri "z" Data "z"
******* UTF 8 *******
.....
'Ò' -> Uri "%C3%92" Data "%C3%92"
'Ó' -> Uri "%C3%93" Data "%C3%93"
'Ô' -> Uri "%C3%94" Data "%C3%94"
'Õ' -> Uri "%C3%95" Data "%C3%95"
'Ö' -> Uri "%C3%96" Data "%C3%96"
.....
EscapeUriString
ist zu kodieren URLs verwendet werden, während EscapeDataString
zum Beispiel der Inhalt eines Cookies zu kodieren verwendet werden soll, weil Cookie-Daten nicht die reservierten Zeichen '='
und ';'
enthalten muss.
Es ist eine Client-Profil nutzbare Version, System.Net.WebUtility Klasse, in Client-Profil System.dll. Hier ist der MSDN-Link:
Hier ist ein Beispiel eine POST-Anforderung senden, dass richtig Parameter codiert application/x-www-form-urlencoded
Inhaltstyp mit:
using (var client = new WebClient())
{
var values = new NameValueCollection
{
{ "param1", "value1" },
{ "param2", "value2" },
};
var result = client.UploadValues("http://foo.com", values);
}
Um UrlEncode ohne System.Web:
String s = System.Net.WebUtility.UrlEncode(str);
//fix some different between WebUtility.UrlEncode and HttpUtility.UrlEncode
s = Regex.Replace(s, "(%[0-9A-F]{2})", c => c.Value.ToLowerInvariant());
Weitere Informationen: https: //www.samnoble .co.uk / 2014/05/21 / Vorsicht-webutility-urlencode-vs-HttpUtility-urlencode /
System.Net.WebUtility.HtmlDecode