URL Encoder / Decoder · Encoding
URL-Encoder / -Decoder & Query-String-Parser
Kodieren Sie einen Wert so, wie es seine Position wirklich verlangt, dekodieren Sie einen, der verstümmelt zurückkam, oder fügen Sie eine ganze URL ein und lesen Sie jeden Query-Parameter mit seinem Rohtext daneben. Doppelte Kodierung, + gegen %20, Punycode-Hosts und wiederholte Schlüssel werden alle beim Namen genannt — clientseitig, ohne Upload.
Läuft in Ihrem Browser — nichts, was Sie einfügen, verlässt diese Seite. Wie wir das belegen
Playground für URL-Encoder, -Decoder und Query-String-Parser
Paste a full URL, a bare query string starting with ?, or a form body like a=1&b=2. Nothing is uploaded — the whole thing runs in this tab, so query strings carrying tokens stay yours.
Results update as you type — press Enter to run now.
Paste a URL to see its components and every query parameter decoded — or switch to Decode or Encode to work on one value at a time.
Die Lücke
Ein Knopf, eine verborgene Vermutung darüber, wohin der Wert gehört.
Fast jedes „URL encode“-Feld im Web ist ein einzelner Knopf, der an encodeURIComponent() hängt — und sagt es nie. Das ist die richtige Regel für einen einzelnen Query-Wert und die falsche für eine URL, die Sie schon zusammengesetzt haben: geben Sie einen Link hinein, und jedes : und / kommt als %3A und %2F zurück. Kodieren Sie versehentlich zweimal, erhalten Sie %2520 — der Fehler, der OAuth-redirect_uri-Rundläufe bricht und einen Webhook-Callback um 3 Uhr morgens auf 404 setzt.
Dieses Werkzeug macht die Wahl explizit, statt sie zu verstecken. Komponenten- oder Ganz-URL-Regeln, + oder %20 — und im Parse-Modus die Komponenten, die ein Browser wirklich senden wird, neben dem Rohtext, den Sie eingefügt haben, mit jedem Parameter dekodiert und markiert: Duplikat, nackter Schlüssel, leerer Wert, doppelt kodiert.
Es ist auch der Grund, keinen Chatbot zu fragen. Ein Sprachmodell, das „das URL-kodieren“ soll, sagt Zeichen vorher: es mischt + und %20 in einem String, vergisst, dass é zwei Bytes sind, und „repariert“ einen doppelt kodierten Wert selbstsicher, indem es ihn ein drittes Mal kodiert. Diese Seite führt den tatsächlichen Algorithmus aus, Byte für Byte, und pinnt jede angewandte Regel mit einem Testvektor — damit Sie die erhaltene Antwort gegen die Spezifikation prüfen können statt gegen einen selbstsicheren Absatz.
Arbeiten Sie an einem Token statt an einer URL? Der JWT Decoder teilt ein JWT und dekodiert es base64url, und der Base64 Encoder / Decoder beherrscht das base64url-Alphabet.
Die Pipeline
So funktioniert es.
Vier deterministische Schritte, alle in Ihrem Browser-Tab — der Rohtext wird diagnostiziert, bevor der URL-Parser irgendetwas wegnormalisieren darf.
-
Zuerst den Rohtext aufteilen.
Die Eingabe wird an ihrem eigenen ? und # geschnitten, bevor ein Parser sie berührt — so kann eine Diagnose auf das genaue Zeichen zeigen. Der URL-Standard entfernt Tabs und Zeilenumbrüche stillschweigend.
-
Jeden Teil einzeln dekodieren.
Namen und Werte werden getrennt dekodiert, damit ein %26 in einem Wert nie zum Trennzeichen und ein %3D nie zum Namenssplit werden kann.
-
Die Bytes als UTF-8 lesen.
Escapes werden zu Bytes, Bytes werden zu Text. Eine fehlerhafte Sequenz wird Byte für Byte benannt, statt den URIError zu werfen, den decodeURIComponent() liefern würde.
-
Wie ein Browser normalisieren — und beides zeigen.
Der WHATWG-Parser liefert, was jeder HTTP-Client tatsächlich senden wird — Punycode-Host, entfernter Standard-Port — mit Ihrem Rohtext daneben.
Referenz
Reservierte Zeichen, nach Komponente.
RFC 3986 hat keine einzige Liste „unsicherer“ Zeichen. Ein Zeichen ist reserviert, weil es an einer bestimmten Stelle etwas bedeutet — ob es kodiert werden muss, hängt also vollständig davon ab, wo es steht.
| Zeichen | In einem Pfadsegment | In Query-Name / -Wert |
|---|---|---|
| / gen-delim | Muss kodiert werden (%2F) — sonst teilt es das Segment | Als Daten sicher, manche Proxys normalisieren es aber |
| ? gen-delim | Muss kodiert werden (%3F) — es beginnt den Query-Teil | Nach dem ersten ? sicher |
| # gen-delim | Muss kodiert werden (%23) | Muss kodiert werden (%23) — es beginnt das Fragment |
| [ ] gen-delim | Muss kodiert werden (%5B %5D) | Muss kodiert werden, auch in einem Namen im Stil tags[] |
| : @ gen-delim | Nach dem ersten Segment sicher | Sicher |
| & sub-delim | Als Daten sicher | Muss kodiert werden (%26) — es trennt Parameter |
| = sub-delim | Als Daten sicher | Muss im Namen kodiert werden (%3D); im Wert sicher |
| + sub-delim | Als Daten sicher | Muss kodiert werden (%2B) — unkodiert liest es sich als Leerzeichen |
| ; sub-delim | Als Daten sicher | Heute sicher, aber ein altes Backend kann daran aufteilen |
| ! $ ' ( ) * , sub-delim | Als Daten sicher | Als Daten sicher — encodeURIComponent() weicht bei ! ' ( ) * ab |
| % Escape-Marker | Immer %25 | Immer %25 — aus einem nackten % entsteht doppelte Kodierung |
| space nicht erlaubt | %20 | %20, oder + in einem Formular-Body |
Was jeder Modus unberührt lässt
Der sichere Satz ist der ganze Unterschied zwischen den Modi — und zwischen RFC 3986 und dem Browser-Built-in.
mode left alone (everything else → %XX)
RFC 3986 component A-Z a-z 0-9 - . _ ~
RFC 3986 whole URL …plus : / ? # [ ] @ ! $ & ' ( ) * + , ; =
form-urlencoded A-Z a-z 0-9 * - . _ (space → +)
encodeURIComponent() A-Z a-z 0-9 - . _ ~ ! ' ( ) *
^^^^^^^^^^
RFC 2396 leftovers — encoded here Einmal gegen zweimal kodiert
Ein doppelt kodierter Wert ist nicht beschädigt — er ist korrekt, nur eine Schicht zu tief.
once https%3A%2F%2Fapp.example.com%2Fcb → https://app.example.com/cb
twice https%253A%252F%252Fapp.example.com → https%3A%2F%2Fapp.example.com
^^^ still escaped: decode again
space %20 → " "
%2520 → "%20" → " " (the % became %25) Nächster Schritt
Der Parameter, den Sie gerade dekodiert haben, ist ein Token. Lesen Sie ihn.
Query-Strings tragen Access-Tokens, signierte URLs und Session-IDs. Sobald ein Wert dekodiert ist, teilt und prüft der JWT Decoder ein base64url-Token, und der Base64 Encoder / Decoder übernimmt alles, was nur kodiert und nicht signiert ist — beides, wie diese Seite, vollständig in Ihrem Browser.
?state=abc%3D%3D → state = abc==
&channel=%23alerts → channel = #alerts
&next=%252Fsettings → next = %2Fsettings ← decode again
&utm_source=a&utm_source=b → two rows, no winner FAQ
Fragen, beantwortet.
Tippen Sie auf eine Frage, um die Antwort aufzuklappen.
Was ist der Unterschied zwischen encodeURI und encodeURIComponent?
encodeURIComponent() kodiert fast alles und ist damit das Richtige für ein einzelnes Stück einer URL — einen Query-Wert, ein Pfadsegment. encodeURI() lässt die reservierten Zeichen : / ? # & = + und sogar # unberührt und ist damit das Richtige für eine URL, die schon zusammengesetzt ist und nur noch von Leerzeichen und Nicht-ASCII-Zeichen befreit werden muss. Geben Sie eine ganze URL an encodeURIComponent, wird sie zu einem undurchsichtigen Block (https%3A%2F%2F…); geben Sie einen einzelnen Wert an encodeURI, wird ein darin enthaltenes & stillschweigend zum Parameter-Trennzeichen. Der Encode-Modus hier legt beides offen: Standard ist die Komponenten-Regel, und die Checkbox „Whole URL“ ist Byte für Byte encodeURI().
Warum wird ein Leerzeichen manchmal zu + und manchmal zu %20?
Beides ist korrekt — an unterschiedlichen Stellen. RFC 3986 kennt nur %20. Die +-Konvention kommt vom Absenden von HTML-Formularen (application/x-www-form-urlencoded) und gilt für Formular-Bodies und, aus langer Gewohnheit, für Query-Strings — weshalb URLSearchParams ein + als Leerzeichen dekodiert, es in einem Pfad aber unberührt lässt. Das heißt: %20 ist immer sicher, während + nur dann ein Leerzeichen ist, wenn der Erzeuger des Werts es so gemeint hat. Der Decode-Modus zeigt Ihnen, welche Konvention angewendet wurde, und lässt Sie umschalten — damit Sie „Ada+Lovelace“ den Namen von „Ada Lovelace“ den zwei Wörtern unterscheiden können.
Was ist Prozent-Kodierung genau?
Prozent-Kodierung ersetzt ein Byte durch ein % gefolgt von diesem Byte als zwei Hexadezimalstellen. Eine URL darf nur einen kleinen Satz von ASCII-Zeichen tragen, also wird alles andere — ein Leerzeichen, ein Akzent, ein Emoji oder ein reserviertes Zeichen, das als Daten benutzt wird — zuerst in UTF-8-Bytes umgewandelt und dann jedes Byte als %XX geschrieben. é sind zwei Bytes und wird daher zu %C3%A9. Dekodieren macht es umgekehrt: die Bytes sammeln und sie dann wieder als UTF-8 lesen.
Wie behebe ich eine doppelt kodierte URL (%2520)?
Zweimal dekodieren. %2520 bedeutet, dass das % von %20 selbst zu %25 kodiert wurde — das passiert, wenn ein Client encodeURIComponent() auf einen bereits kodierten Wert anwendet, der klassische OAuth-redirect_uri-Fehler. Dieses Werkzeug erkennt das: Fügen Sie den Wert im Decode-Modus ein, und es meldet, dass der erste Durchgang noch Escapes enthält, zeigt, was ein zweiter Durchgang ergibt, und bietet eine Schaltfläche „Decode again“. Die eigentliche Lösung liegt weiter oben: genau einmal kodieren, und zwar in dem Moment, in dem der Wert in die URL gesetzt wird.
Warum zeigt mein dekodierter Text � statt eines Akzents?
Weil die kodierten Bytes kein gültiges UTF-8 sind. %C3%A9 ist eine wohlgeformte Zwei-Byte-Sequenz und wird zu é; %E9 allein ist hingegen das Latin-1-Byte (ISO-8859-1) für é und in UTF-8 unzulässig — es wird daher zu U+FFFD, dem Ersatzzeichen. Dieses Werkzeug benennt die betroffenen Bytes, anstatt wie decodeURIComponent() einen URIError zu werfen. Das sagt Ihnen, dass der Wert aus der falschen Quellkodierung stammt, statt Sie rätseln zu lassen.
Was passiert, wenn ein Query-String denselben Schlüssel wiederholt?
Kein Teil des URL-Standards legt fest, welcher gewinnt — deshalb wird hier jede Zeile aufgeführt und die späteren werden als Duplikate markiert. In der Praxis behalten PHP und Express den letzten Wert, Go’s r.URL.Query() liefert alle, ASP.NET verbindet sie mit Kommas, und Rails gruppiert sie nur, wenn der Schlüssel auf [] endet. Genau diese Uneinigkeit ist der Grund, warum ein Werkzeug alle Werte zeigen sollte, statt still einen auszuwählen.
Was ist Punycode, und warum hat sich mein Host geändert?
Punycode ist die ASCII-Kodierung eines internationalisierten Domainnamens. DNS trägt nur ASCII-Labels, also wird münchen.example zu xn--mnchen-3ya.example umgewandelt, bevor überhaupt eine Auflösung stattfindet — und diese ASCII-Form muss auch ein TLS-Zertifikat treffen. Der Parser zeigt hier den umgewandelten Host mit dem von Ihnen eingegebenen Namen darunter, sodass Sie eine ähnlich aussehende Domain erkennen können. Absichtlich wandelt er Punycode nicht zurück nach Unicode: einen von Angreifern gelieferten Namen als schönes Unicode darzustellen, ist genau die Grundlage von Homograph-Phishing.
Welche Zeichen müssen in einer URL nie kodiert werden?
Der unreservierte Satz aus RFC 3986 §2.3: A–Z, a–z, 0–9 und die vier Zeichen - . _ ~. Diese sind überall sicher und dürfen niemals unnötig kodiert werden, denn %2D und - sind dieselbe URL, und ein erneutes Kodieren bricht Signaturverfahren, die den Rohstring hashen. Beachten Sie: encodeURIComponent() lässt außerdem ! ' ( ) * unberührt — ein Überrest des älteren „mark“-Satzes aus RFC 2396. RFC 3986 führt diese fünf als Sub-Delimiter, also kodiert der Komponenten-Modus hier sie und sagt Ihnen, wenn er vom Browser-Built-in abweicht.
Kann ein Semikolon Query-Parameter trennen?
Nicht mehr. HTML empfahl einmal, dass Server neben & auch ; als Parameter-Trennzeichen akzeptieren; dieser Hinweis wurde 2014 aus der Spezifikation entfernt. Browser und URLSearchParams haben es nie als Trennzeichen behandelt, also ist a=1;b=2 ein einzelner Parameter namens a mit dem wörtlichen Wert 1;b=2. Dieses Werkzeug verhält sich genauso und warnt, wenn es ein Semikolon sieht — denn ein altes Backend kann noch daran aufteilen und damit dem Browser davor widersprechen.
Ist es sicher, eine URL mit einem Token einzufügen?
Ja — das gesamte Werkzeug ist eine statische Seite ohne Server dahinter. Parsen, Kodieren und Dekodieren laufen in Ihrem Browser-Tab, nichts wird hochgeladen, es gibt kein Logging und kein Konto. Das zählt hier mehr als bei den meisten Werkzeugen, denn Query-Strings sind genau der Ort, an dem Access-Tokens, signierte URLs, Session-IDs und E-Mail-Adressen landen. Wenn Sie eine zweite Meinung möchten: öffnen Sie beim Tippen das Netzwerk-Panel der Entwicklertools — es gibt keinen Request zu sehen.
More free, private DevOps tools.
Der URL Encoder / Decoder ist eines der Werkzeuge in OpsCanopy — einem wachsenden Schirm browserbasierter Validatoren, Konverter und Tester, die niemals einen Server berühren.
Mehr aus Kodierung
39 kostenlose Tools, jedes einzelne offlinefähig — opscanopy.com funktioniert ohne Registrierung, und nichts wird hochgeladen.
Verwandte Encoding-Werkzeuge: der Base64 Encoder / Decoder, der JWT Decoder und Slugify, um einen Titel in einen saubereren Pfad zu verwandeln, oder durchstöbern Sie das vollständige Werkzeugverzeichnis.
Bereitgestellt wie besehen zur bequemen Nutzung; Prozent-Kodierung ist eine Kodierung, kein Schutz — ein Token in einem Query-String ist immer noch ein Token in einer Logdatei. OpsCanopy ist kostenlos und offen.