Antworten:
HttpServerUtility.UrlEncode
wird HttpUtility.UrlEncode
intern verwendet. Es gibt keinen spezifischen Unterschied. Der Grund für die Existenz Server.UrlEncode
ist die Kompatibilität mit klassischem ASP.
Ich hatte vorher erhebliche Kopfschmerzen mit diesen Methoden. Ich empfehle Ihnen , jede Variante zu vermeidenUrlEncode
und stattdessen zu verwendenUri.EscapeDataString
- zumindest hat diese ein verständliches Verhalten.
Mal schauen...
HttpUtility.UrlEncode(" ") == "+" //breaks ASP.NET when used in paths, non-
//standard, undocumented.
Uri.EscapeUriString("a?b=e") == "a?b=e" // makes sense, but rarely what you
// want, since you still need to
// escape special characters yourself
Aber mein persönlicher Favorit muss HttpUtility.UrlPathEncode sein - dieses Ding ist wirklich unverständlich. Es codiert:
Es enthält auch die sehr spezifische MSDN-Dokumentation "Codiert den Pfadabschnitt einer URL-Zeichenfolge für eine zuverlässige HTTP-Übertragung vom Webserver zu einem Client." - ohne wirklich zu erklären, was es tut. Es ist weniger wahrscheinlich, dass Sie sich mit einem Uzi in den Fuß schießen ...
Kurz gesagt, bleiben Sie bei Uri.EscapeDataString .
?
und wer soll sagen, welche codiert werden sollen und welche als Trennzeichen dienen? Zum Leerzeichen: In beiden Fällen befindet sich das Leerzeichen im Hash, sodass das Vorhandensein oder Fehlen eines Abfragefragments keine Rolle spielen sollte. Und schließlich ist es unentschuldbar, einen Uri wie im zweiten Beispiel mit einem% zu beschädigen. Die UrlPathEncode
Methode ist einfach gegabelt und sollte niemals angewendet werden.
Fast 9 Jahre, seit dies zum ersten Mal gefragt wurde, und in der Welt von .NET Core und .NET Standard scheinen WebUtility.UrlEncode (unter System.Net
) und Uri.EscapeDataString die häufigsten Optionen für die URL-Codierung zu sein . Nach der beliebtesten Antwort hier und anderswo zu urteilen, scheint Uri.EscapeDataString vorzuziehen zu sein. Aber ist es? Ich habe einige Analysen durchgeführt, um die Unterschiede zu verstehen, und hier ist, was ich mir ausgedacht habe:
WebUtility.UrlEncode
codiert den Raum als +
; Uri.EscapeDataString
codiert es als %20
.Uri.EscapeDataString
Prozent-codiert !
, (
, )
, und *
; WebUtility.UrlEncode
nicht.WebUtility.UrlEncode
Prozent-Codierungen ~
; Uri.EscapeDataString
nicht.Uri.EscapeDataString
wirft eine UriFormatException
Zeichenfolge mit mehr als 65.520 Zeichen; WebUtility.UrlEncode
nicht. ( Ein häufigeres Problem als Sie vielleicht denken, insbesondere beim Umgang mit URL-codierten Formulardaten .)Uri.EscapeDataString
wirft ein UriFormatException
auf die hohen Ersatzzeichen ; WebUtility.UrlEncode
nicht. (Das ist eine UTF-16-Sache, wahrscheinlich viel seltener.)Für die URL-Codierung passen Zeichen in eine von drei Kategorien: nicht reserviert (legal in einer URL); reserviert (legal in, hat aber eine besondere Bedeutung, daher möchten Sie es möglicherweise codieren); und alles andere (muss immer verschlüsselt sein).
Laut RFC sind die reservierten Zeichen::/?#[]@!$&'()*+,;=
Und die nicht reservierten Zeichen sind alphanumerisch und -._~
Uri.EscapeDataString definiert seine Mission klar:% -encode alle reservierten und illegalen Zeichen. WebUtility.UrlEncode ist sowohl in der Definition als auch in der Implementierung mehrdeutig. Seltsamerweise codiert es einige reservierte Zeichen, aber nicht andere (warum Klammern und keine Klammern?), Und seltsamerweise codiert es dieses unschuldig nicht reservierte ~
Zeichen.
Daher stimme ich dem beliebten Rat zu: Verwenden Sie nach Möglichkeit Uri.EscapeDataString und verstehen Sie, dass reservierte Zeichen wie /
und ?
codiert werden. Wenn Sie mit potenziell großen Zeichenfolgen umgehen müssen, insbesondere mit URL-codiertem Formularinhalt, müssen Sie entweder auf WebUtility.UrlEncode zurückgreifen und dessen Macken akzeptieren oder das Problem auf andere Weise umgehen .
EDIT: Ich habe versucht , alle der Macken oben erwähnt zu korrigieren Flurl über die Url.Encode
, Url.EncodeIllegalCharacters
und Url.Decode
statischen Methoden. Diese befinden sich im Kernpaket (das winzig ist und nicht alle HTTP-Inhalte enthält) oder können von der Quelle kopiert werden. Ich freue mich über Ihre Kommentare / Rückmeldungen zu diesen Themen.
Hier ist der Code, mit dem ich herausgefunden habe, welche Zeichen unterschiedlich codiert sind:
var diffs =
from i in Enumerable.Range(0, char.MaxValue + 1)
let c = (char)i
where !char.IsHighSurrogate(c)
let diff = new {
Original = c,
UrlEncode = WebUtility.UrlEncode(c.ToString()),
EscapeDataString = Uri.EscapeDataString(c.ToString()),
}
where diff.UrlEncode != diff.EscapeDataString
select diff;
foreach (var diff in diffs)
Console.WriteLine($"{diff.Original}\t{diff.UrlEncode}\t{diff.EscapeDataString}");
Denken Sie daran, dass Sie wahrscheinlich keine dieser Methoden anwenden sollten. Die Anti-Cross Site Scripting Library von Microsoft enthält Ersatz für HttpUtility.UrlEncode
und HttpUtility.HtmlEncode
das ist sowohl standardkonformer als auch sicherer. Als Bonus erhalten Sie auch eine JavaScriptEncode
Methode.