2015-06-19 12 views
6

Nach http://www.w3schools.com/tags/ref_urlencode.asp Wenn Anfragen gesendet werden, sind sie URL-codiert, so wird beispielsweise Speicherplatz in% 20 umgewandelt. So weit, ist es gut..NET UrlEncode funktioniert nicht?

Ich habe ein Problem mit!. Wenn Sie es in das Formular eingeben, wird es wie gewünscht in% 21 konvertiert. Aber HttpUtility.UrlEncode (oder seine WebUtility Partner) oder Uri.EscapeDataString alle werden zurück! Ist das ein erwartetes Verhalten? Wie sollte ich meine Eingabe von C# codieren, damit sie die richtigen Werte konvertiert?

+0

Ich kann Ihnen keine technische Erklärung geben, aber ich kann bestätigen, dass es Abweichungen gibt. Ich habe auch viele verschiedene implementierte URL-Kodierungen gefunden. –

+0

Beachten Sie, dass Javascript 'encodeURIComponent' dasselbe tut. Es gibt eine Anmerkung in der [mozilla Hilfe zu dieser Funktion] (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent), die besagt: * Strengere Einhaltung von RFC 3986 (was Reserven!, ', (,) und *), auch wenn diese Zeichen keine formellen URI-Abgrenzung verwendet, kann das folgende sicher verwendet werden: * – xanatos

+0

Dies ist sehr interessant/seltsam. So haben wir einige Zeichen, die in 'grauer' Zone sind und können, müssen aber nicht codiert werden –

Antwort

6

Ein Ausrufezeichen wird als URL-sicheres ASCII-Zeichen betrachtet und daher nicht prozentual codiert.

Von MSDN

Die UrlEncode Methode URL-kodiert jedes Zeichen, das nicht in der Menge von ASCII-Zeichen ist, die als URL-sicher angesehen wird. Leerzeichen sind codiert als das ASCII "+" Zeichen. URL-sichere ASCII-Zeichen umfassen die ASCI-Zeichen (A bis Z und a bis z), Ziffern (0 bis 9) und einige Interpunktionszeichen. In der folgenden Tabelle sind die Interpunktionszeichen aufgelistet, die als URL-sichere ASCII-Zeichen gelten.

Die Tabelle enthält - _ . ! * ()

aktualisiert

Nach this answer, Uri.EscapeDataString sollte die ! kodieren, wenn .NET 4.5 Projekte Targeting, aber ich bin nicht in der Lage, es zu testen auf meiner aktuellen Maschine. EscapeDataString in früheren .NET-Frameworks codiert nicht die oben genannten Zeichen. Sie müssen einfach String.Replace verwenden und die obigen Zeichen aus dem maskierten URI ersetzen.

+0

Danke keyboardP - Gibt es eine Möglichkeit in .NET diese zu kodieren? –

+0

@MarcinWaligora Aktualisierte Antwort – keyboardP

1

Also haben wir einige Zeichen, die in 'grau' Zone sind und können, müssen aber nicht codiert werden.

Alle Zeichen können codiert werden. http://stackoverflow.com/questions und http://stackoverflow.com/%71%75%65%73%74%69%6F%6E%73 sind beide identisch.

Das einzige Mal, wenn ein Zeichen nicht codiert werden kann, ist es, wenn es in einer Weise verwendet wird, die eine spezielle Bedeutung mit URIs hat, wie die / Trennpfadelemente.

Das einzige Mal, wenn ein Zeichen codiert werden müssen, wenn:

  1. Es ist einer dieser besonderen gemeinte Zeichen, und nicht mit dieser speziellen Bedeutung verwendet werden.
  2. Es ist eines der reservierten Zeichen, das in einem bestimmten URI-Schema oder an einem bestimmten Ort eine besondere Bedeutung haben kann.
  3. Es hat einen Codepunkt über U + 007F.

Es gibt jedoch Ausnahmen zu den letzten beiden.

Im dritten Fall, wenn Sie ein IRI verwenden, dann codieren Sie solche Zeichen nicht, was so ziemlich die Definition eines IRI ist. Sie können zwischen IRI und URI konvertieren, indem Sie diese Codierung ausführen oder rückgängig machen. (Alle derartigen Zeichen im Host-Teil müssen Punycode-codiert sein, nicht URI-codiert).

Im zweiten Fall ist es sicher, das Zeichen nicht zu codieren, wenn es im betreffenden Kontext nicht als Trennzeichen verwendet wird. So kann beispielsweise & in einigen URIs verbleiben, aber nicht in HTTP-URIs, wo es oft als Trennzeichen für Abfragedaten verwendet wird. Dies hängt jedoch davon ab, dass das spezielle URI-Schema besonders bekannt ist. Es ist wahrscheinlich auch nicht das Risiko eines anderen Prozesses wert, ohne zu merken, dass es in Ordnung ist.

! ist ein Beispiel dafür. RFC 3986 umfasst die Produktion:

reserved = gen-delims/sub-delims 

gen-delims = ":"/"/"/"?"/"#"/"["/"]"/"@" 

sub-delims = "!"/"$"/"&"/"'"/"("/")" 
      /"*"/"+"/","/";"/"=" 

Und so ! ist in der Gruppe von Zeichen, die sicher sein können unverschlüsselte oder nicht, je nach dem Schema in Gebrauch zu verlassen.

Im Allgemeinen, wenn Sie Ihre eigene Codierung Code (wie wenn eine HttpEncoder Implementierung Schreiben) zu schreiben sind Sie wahrscheinlich besser dran, nur immer ! kodiert, aber wenn Sie einen Encoder verwenden, das nicht ! alle nicht codiert die Zeit ist wahrscheinlich auch okay; sicherlich in HTTP-URIs sollte es keinen Unterschied machen.