it-swarm.com.de

Wie können Sie ohne System.Web urlEncode eingeben?

Ich versuche, eine Windows-Clientanwendung zu schreiben, die eine Website für Daten aufruft. Um die Installation auf ein Minimum zu beschränken, versuche ich nur dlls im .NET Framework Client Profile . Das Problem ist, dass ich einige Parameter urlEncode muss. Gibt es eine einfache Möglichkeit, dies zu tun, ohne die System.Web.dll zu importieren, die nicht Teil des Client-Profils ist?

293
Martin Brown

System.Uri.EscapeUriString() kann bei bestimmten Zeichen problematisch sein, für mich war das Nummernzeichen # in der Zeichenfolge.

Wenn dies ein Problem für Sie ist, versuchen Sie Folgendes:

System.Uri.EscapeDataString() //Works excellent with individual values

Hier ist eine Antwort SO, die den Unterschied erklärt:

Was ist der Unterschied zwischen EscapeUriString und EscapeDataString?

und empfiehlt, Uri.EscapeDataString() in jedem Aspekt zu verwenden.

296
ToddBFisher

Verwenden Sie in .Net 4.5+ WebUtility

Nur zum Formatieren sende ich dies als Antwort.

Konnte keine guten Beispiele finden, die sie so vergleichen:

_string testString = "http://test# space 123/text?var=val&another=two";
Console.WriteLine("UrlEncode:         " + System.Web.HttpUtility.UrlEncode(testString));
Console.WriteLine("EscapeUriString:   " + Uri.EscapeUriString(testString));
Console.WriteLine("EscapeDataString:  " + Uri.EscapeDataString(testString));
Console.WriteLine("EscapeDataReplace: " + Uri.EscapeDataString(testString).Replace("%20", "+"));

Console.WriteLine("HtmlEncode:        " + System.Web.HttpUtility.HtmlEncode(testString));
Console.WriteLine("UrlPathEncode:     " + System.Web.HttpUtility.UrlPathEncode(testString));

//.Net 4.0+
Console.WriteLine("WebUtility.HtmlEncode: " + WebUtility.HtmlEncode(testString));
//.Net 4.5+
Console.WriteLine("WebUtility.UrlEncode:  " + WebUtility.UrlEncode(testString));
_

Ausgänge:

_UrlEncode:             http%3a%2f%2ftest%23+space+123%2ftext%3fvar%3dval%26another%3dtwo
EscapeUriString:       http://test#%20space%20123/text?var=val&another=two
EscapeDataString:      http%3A%2F%2Ftest%23%20space%20123%2Ftext%3Fvar%3Dval%26another%3Dtwo
EscapeDataReplace:     http%3A%2F%2Ftest%23+space+123%2Ftext%3Fvar%3Dval%26another%3Dtwo

HtmlEncode:            http://test# space 123/text?var=val&another=two
UrlPathEncode:         http://test#%20space%20123/text?var=val&another=two

//.Net 4.0+
WebUtility.HtmlEncode: http://test# space 123/text?var=val&another=two
//.Net 4.5+
WebUtility.UrlEncode:  http%3A%2F%2Ftest%23+space+123%2Ftext%3Fvar%3Dval%26another%3Dtwo
_

Verwenden Sie in .Net 4.5+ WebUtility _.UrlEncode_

Dies scheint _HttpUtility.UrlEncode_ (vor v4.0) für die gebräuchlichsten Zeichen zu replizieren:
Uri.EscapeDataString(testString).Replace("%20", "+").Replace("'", "%27").Replace("~", "%7E")
Hinweis: EscapeUriString behält eine gültige URI-Zeichenfolge bei, sodass so viele Klartextzeichen wie möglich verwendet werden.

In dieser Antwort finden Sie eine Tabelle, in der die verschiedenen Codierungen verglichen werden:
https://stackoverflow.com/a/11236038/555798

Zeilenumbrüche Alle hier aufgeführten (außer _HttpUtility.HtmlEncode_) konvertieren _"\n\r"_ in _%0a%0d_ oder _%0A%0D_

Bitte zögern Sie nicht, dies zu bearbeiten und meinem Teststring neue Zeichen hinzuzufügen, oder lassen Sie sie in den Kommentaren und ich werde es bearbeiten.

242
Thymine

Sie können verwenden

Uri.EscapeUriString (siehe http://msdn.Microsoft.com/de-de/library/system.uri.escapeuristring.aspx )

52
Matthew Manela

Die Antworten hier sind sehr gut, aber für mich noch unzureichend.

Ich habe eine kleine Schleife geschrieben, die Uri.EscapeUriString mit Uri.EscapeDataString für alle Zeichen von 0 bis 255 vergleicht.

HINWEIS: Beide Funktionen verfügen über die integrierte Intelligenz, dass Zeichen oberhalb von 0x80 zuerst UTF-8-codiert und dann in Prozent codiert werden.

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 wird verwendet, um URLs zu kodieren, während EscapeDataString verwendet werden soll, um beispielsweise den Inhalt eines Cookies zu kodieren, da Cookie-Daten nicht die reservierten Zeichen '=' und ';' enthalten dürfen.

19
Elmue

Es gibt eine verwendbare Version des Clientprofils, die Klasse System.Net.WebUtility, die im Clientprofil System.dll vorhanden ist. Hier ist der MSDN Link:

WebUtility

15
Sprague

Hier ein Beispiel für das Senden einer POST -Anforderung, die die Parameter ordnungsgemäß mit dem Inhaltstyp application/x-www-form-urlencoded codiert:

using (var client = new WebClient())
{
    var values = new NameValueCollection
    {
        { "param1", "value1" },
        { "param2", "value2" },
    };
    var result = client.UploadValues("http://foo.com", values);
}
8
Darin Dimitrov

So geben Sie den URL-Code an, ohne System.Web zu verwenden:

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/beware-webutility-urlencode-vs-httputility-urlencode/

0
Aaron Qiu