Laut RFC 3986 sind die folgenden Zeichen reserviert und müssen in Prozent codiert werden, damit sie verwendet werden können in einem URI anders als ihre reservierten Verwendungen:
:/?#[]@!$&'()*+,;=
Außerdem gibt es einige Zeichen an, die speziell nicht reserviert sind : a-zA-Z0-9\-._~
Es scheint klar zu sein, dass man im Allgemeinen reservierte Zeichen kodieren sollte (um Fehlinterpretationen zu vermeiden) und nicht reservierte Zeichen kodieren (für Lesbarkeit), aber wie sollten Zeichen behandelt werden, die keiner Kategorie angehören? Beispiel {
und }
erscheinen nicht in einer der beiden Listen, sondern sind Standard-ASCII-Zeichen.
Wenn man nach modernen Browsern sucht, scheinen sie manchmal unterschiedliche Verhaltensweisen zu haben.
Stellen Sie sich beispielsweise vor, die URL https://www.google.com/search?q={
in die Adressleiste eines Webbrowsers einzufügen:
https://www.google.com/search?q=%7B
Wenn jedoch https://www.google.com/#q={
eingefügt wird (Entfernen von "search" und Ändern von ?
in ein #
, wodurch das Zeichen Teil des Fragments / hash anstelle der Abfragezeichenfolge wird), finden wir Folgendes:
https://www.google.com/#q=%7B
(über JavaScript) https://www.google.com/#q=%7B
(vor der Ausführung von JavaScript) Darüber hinaus, wenn Sie JavaScript verwenden, um die Anfrage asynchron durchzuführen (zB dieses MDN-Beispiel geändert) Um eine URL von ?q={
) zu verwenden, wird die URL nicht automatisch in Prozent codiert. (Ich nehme an, das liegt daran, dass die XMLHttpRequest-API davon ausgeht, dass die URL zuvor codiert / maskiert wurde.)
Ich möchte (aus einem Grund, der mit einer bizarren Kundenanforderung zusammenhängt) {
und }
im Dateinamensteil von URLs verwenden, ohne (1) Dinge zu brechen und idealerweise auch ohne (2) hässlich aussehende Prozent zu erzeugen -codierte Einträge im Netzwerk-Panel der Web Inspectors / Debugger von modernen Browsern.
(RFC 2396 )
Sie sollten einen der unwise -Abschnitt codieren und der RFC gibt den Grund dafür an.
zusätzliche Informationen aus dem RFC
Konto für
<
>
#
%
primär
beliebige Steuerzeichen 00-1F
und 7F
auch als unwise im RFC markiert: "
{
}
|
\
^
[
]
'
Wenn Sie #
in den Querystring-Werten angeben möchten, ist das ein Sonderfall, weil ein #
ein Fragmentkennung eines uri.
Einige Zeichen, die nicht codiert werden müssen, werden entweder codiert oder nicht akzeptiert, z. B. ~
Es gibt 2 allgemein akzeptierte Kodierungen für (Leerzeichen)
%20
und +
Hier ist eine Geige mit einigen der Testfälle, die ich benutze.
Tags und Links uri percent-encoding rfc3986