Was Prozentkodierung tut
Eine URL darf nur eine begrenzte Menge ASCII-Zeichen enthalten, und einige davon (/, ?, &, =, #) haben strukturelle Bedeutung. Jedes andere Byte wird als Prozentzeichen und zwei Hex-Ziffern geschrieben: ein Leerzeichen ist %20, & ist %26, und die UTF-8-Bytes von é sind %C3%A9. RFC 3986 legt die Regeln fest.
Drei Modi, weil der Kontext zählt
| Modus | Maskiert | Behält | Verwenden, wenn |
|---|---|---|---|
| Query-Komponente | Alles außer A–Z a–z 0–9 - _ . ~ | Nur unreservierte Zeichen | Ein Wert in einen Query-Parameter oder ein Pfadsegment kommt: ?q=…. Entspricht encodeURIComponent. |
| Ganze URL | Leerzeichen, Nicht-ASCII, Anführungszeichen, < >… | : / ? # [ ] @ & = + $ , ; | Eine vollständige URL bereinigt werden soll, ohne ihre Struktur zu zerstören. Entspricht encodeURI. |
| Formulardaten | Wie Komponente, aber Leerzeichen wird + | Bodies von HTML-Formularen (application/x-www-form-urlencoded), was die meisten HTTP-Bibliotheken standardmäßig senden. |
Der häufigste Fehler ist, die Ganze-URL-Kodierung auf einen Wert anzuwenden, der & oder = enthält: Der Server teilt den Parameter in zwei. Kodieren Sie Werte nach den Komponentenregeln und fügen Sie sie erst danach zusammen.
Pluszeichen
In einem Formular-Body (und per Konvention im Query-String) bedeutet + ein Leerzeichen, deshalb muss das Dekodieren von Formulardaten + in ein Leerzeichen wandeln, während ein echtes Plus als %2B gesendet worden sein muss. In einem Pfad ist + einfach ein Plus. Der Schalter + als Leerzeichen dekodieren deckt beide Fälle ab.
Doppelte Kodierung
Wenn Sie %2520 in einer URL sehen, hat etwas eine bereits kodierte Zeichenkette noch einmal kodiert: %20 wurde als Text behandelt und sein % wurde zu %25. Zweimal dekodieren stellt das Original wieder her; dann den Code reparieren, der doppelt kodiert hat.
Fragen
Was ist %20?
Ein Leerzeichen. 0x20 ist der ASCII-Code für das Leerzeichen, die Prozentkodierung schreibt es also als %20. In Formulardaten kann es stattdessen als + erscheinen.
Was ist der Unterschied zwischen encodeURI und encodeURIComponent?
encodeURIComponent maskiert jedes Zeichen, das strukturell sein könnte (einschließlich /, ?, & und =), und ist für einzelne Werte. encodeURI lässt diese in Ruhe, damit eine ganze URL eine URL bleibt. Nehmen Sie für Ersteres den Modus Query-Komponente, für Letzteres Ganze URL.
Wie werden Umlaute und andere Sonderzeichen kodiert?
Als Bytes ihrer UTF-8-Form, jedes als %XX geschrieben. é sind zwei Bytes (%C3%A9), 日 sind drei (%E6%97%A5). Ältere Systeme nutzten manchmal Latin-1, was %E9 für é ergibt; moderne Browser und APIs verwenden UTF-8.
Warum schlägt das Dekodieren bei meiner Zeichenkette fehl?
Entweder folgt auf ein % nicht zwei Hex-Ziffern (ein einzelnes Prozentzeichen muss als %25 geschrieben werden), oder die maskierten Bytes ergeben kein gültiges UTF-8. Die Fehlermeldung sagt, was zutrifft.
Soll ich die ganze URL kodieren oder nur die Parameter?
Nur die Parameter (und jedes Pfadsegment, das Benutzertext enthält). Bauen Sie die URL aus bereits kodierten Teilen zusammen, damit die Trennzeichen unmaskiert bleiben.