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:
- Es ist einer dieser besonderen gemeinte Zeichen, und nicht mit dieser speziellen Bedeutung verwendet werden.
- Es ist eines der reservierten Zeichen, das in einem bestimmten URI-Schema oder an einem bestimmten Ort eine besondere Bedeutung haben kann.
- 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.
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. –
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
Dies ist sehr interessant/seltsam. So haben wir einige Zeichen, die in 'grauer' Zone sind und können, müssen aber nicht codiert werden –