Zum Inhalt springen

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

Läuft in Ihrem Browser RFC 3986 pro Komponente Keine Anmeldung Aktualisiert am 30.07.2026

Playground für URL-Encoder, -Decoder und Query-String-Parser

Examples
Mode
Options

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.

Result

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.

  1. 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.

  2. 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.

  3. 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.

  4. 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.

safe-sets
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.

double-encoding
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.

callback.txt
?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.

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().

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.

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.

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.

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.

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.

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.

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.

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.

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.

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.