URL dekodieren

Füge eine prozentkodierte Zeichenkette ein und lies sie zurück. Meistens landet hier eine URL aus einem Logfile oder einem Analytics-Export, in der der eigentlich interessante Teil irgendwo unter einer Kette aus `%3A%2F%2F` liegt. Mehrbyte-Zeichen werden korrekt wieder zusammengesetzt, Umlaute und Emoji kommen also als sie selbst zurück und nicht als Reihe von Fragezeichen.

Query-Strings aus HTML-Formularen schreiben Leerzeichen als +. In einem Pfad ist ein Plus ein Plus.

Ergebnis

Die Antwort erscheint hier, während du tippst.

  • Wo es läuft

    Es wird nichts hochgeladen, weil es keine Datei gibt — gerechnet wird in dieser Seite.

  • Keine Warteschlange, kein Konto

    Es antwortet so schnell, wie dein Rechner es hergibt, und fragt nie, wer du bist.

  • So oft du willst

    Nichts wird gezählt und nichts begrenzt — noch einmal zu antworten kostet uns nichts.

So funktioniert es

  1. Füge den kodierten Text in das Feld ein.
  2. Entscheide, was ein Pluszeichen bedeutet. In einem Query-String ist es ein Leerzeichen, in einem Pfad ein Plus.
  3. Lies das Ergebnis. Dafür wurde nichts hochgeladen.

Eine Prozentsequenz ist ein Byte, kein Buchstabe

Dekodieren ist keine Nachschlagetabelle von `%41` zu `A`. Jede Sequenz bezeichnet ein Byte, und die Bytes bilden zusammen UTF-8-Zeichen — `%C3%BC` ist also ein einzelnes `ü` aus zwei Sequenzen, und ein Emoji besteht aus vier. Ein Dekodierer, der Sequenz für Sequenz übersetzt, erzeugt zwei Mojibake-Zeichen, wo eines stehen sollte.

Deshalb lässt sich eine unvollständige Sequenz auch nicht einfach überspringen. `%E0%A4` sind die ersten zwei Bytes eines Drei-Byte-Zeichens; es gibt keine richtige Ausgabe, nur eine Vermutung. Diese Seite meldet das als fehlerhaft, statt zu raten — der Unterschied zwischen dem Wissen, dass die Eingabe abgeschnitten war, und dem stillen Glauben an eine falsche Antwort.

Das Pluszeichen ist eine echte Mehrdeutigkeit

Es gibt keine Regel, die sie aus der Zeichenkette allein auflöst. `application/x-www-form-urlencoded` — das, was ein HTML-Formular absendet und was die meisten Query-Strings in der Praxis sind — schreibt ein Leerzeichen als `+`. Die Prozentkodierung selbst kennt diese Regel nicht, in einem Pfad ist `+` also schlicht ein Pluszeichen.

Dieselben acht Zeichen dekodieren also auf zwei Arten, je nachdem, woher sie stammen, und nur du weißt welche. Deshalb wird die Einstellung angeboten statt angenommen. Bei einem Query-String ist „Leerzeichen“ fast immer richtig; bei einem Pfad oder einem Wert, der legitim ein Plus enthalten kann — eine Telefonnummer, eine Suche nach `C++` —, ist es das nicht.

Eine doppelt kodierte Zeichenkette erkennen

Enthält das Ergebnis noch Prozentsequenzen, war der Text zweimal kodiert und du hast eine Schicht abgetragen. Das Erkennungszeichen ist `%2520`: Das ist ein `%20`, dessen `%` selbst als `%25` kodiert wurde. Einmal dekodieren gibt `%20`, noch einmal gibt das Leerzeichen.

Es lohnt sich, das zu bemerken statt einfach zweimal zu dekodieren, denn doppelte Kodierung ist weiter oben ein Fehler — meist ein Framework, das einen Wert kodiert, und eine Vorlage, die es noch einmal tut. Für die Nutzerin sichtbar wird es als `Hello%20world` in einem Seitentitel, und bis dahin liegen mehrere Systeme zwischen Ursache und Wirkung.

Eine URL aus einem Logfile lesen

Das ist der häufigste Grund, hier zu sein. Ein Zugriffsprotokoll oder ein Analytics-Export speichert die vollständige Anfragezeile, und jede URL, die selbst ein Parameter war — ein Weiterleitungsziel, ein Callback, ein Referrer —, kommt einmal für sich kodiert an und ein zweites Mal für die, in der sie steckt.

Die äußere Schicht zu dekodieren macht die innere URL lesbar; noch einmal zu dekodieren macht deren eigene Parameter lesbar. Ein drittes Mal sollte man nicht aus Gewohnheit dekodieren: Dann dekodiert man Sequenzen, die im Original wörtlicher Text waren, und macht aus einem `%` in jemandes Suchbegriff etwas anderes.

Was eine fehlerhafte Sequenz bedeutet

Die Meldung heißt, dass die Bytes, die deine Prozentsequenzen ergeben, keine gültigen UTF-8-Zeichen bilden. Die häufigste Ursache ist eine abgeschnittene Kopie mitten in einem Mehrbyte-Zeichen; die zweithäufigste ist etwas Altes, das in Latin-1 kodiert hat.

Im zweiten Fall gibt es keine richtige Antwort, sondern nur eine Entscheidung darüber, welche Kodierung gemeint war — und diese Seite trifft sie nicht für dich. Das ist bewusst: Ein Dekodierer, der stillschweigend auf Latin-1 ausweicht, liefert lesbaren Text, der an einzelnen Stellen falsch ist, und das ist die unangenehmste Art von Fehler.

Warum das Ergebnis manchmal kürzer aussieht als erwartet

Prozentkodierung verlängert: Aus einem Zeichen werden drei, aus einem Umlaut sechs. Dekodieren kehrt das um, und eine lange Kette aus Sequenzen schrumpft dabei erheblich — eine kodierte URL von vierhundert Zeichen kann als hundertzwanzig zurückkommen.

Das ist kein Datenverlust, sondern der Grund, warum überhaupt kodiert wurde. Auffällig wird es nur, wenn jemand die Länge als Prüfung benutzt hat: Ein Feld, das die kodierte Form gerade noch fasst, fasst die dekodierte mühelos, aber umgekehrt gilt das nicht.

Der Teil nach dem Rautezeichen

Ein Anker wird nie an den Server geschickt — er bleibt vollständig im Browser. Wer eine URL aus einem Zugriffsprotokoll dekodiert und sich wundert, warum der Anker fehlt, sucht nach etwas, das dort nie war.

Das ist auch der Grund, warum Analytics-Werkzeuge den Anker nur kennen, wenn ein Skript im Browser ihn ausdrücklich meldet. Zwei Datenquellen über dieselben Aufrufe können sich hier also legitim unterscheiden, ohne dass eine von beiden falsch wäre.

Dekodieren ist nicht entschärfen

Eine dekodierte Zeichenkette ist roher, unkontrollierter Text. Sie in eine Seite, ein Protokoll oder eine Datenbankabfrage einzusetzen, ohne sie für das jeweilige Ziel zu behandeln, ist genau der Weg, auf dem aus einem Query-Parameter ein Cross-Site-Scripting oder ein manipulierter Log-Eintrag wird.

Diese Seite ist ein Lesewerkzeug für Menschen. Wer dekodierte Werte weiterverarbeitet, braucht danach die zum Ziel passende Maskierung — HTML-Sonderzeichen für eine Seite, Parameterbindung für eine Datenbank —, und das ist ein eigener Schritt und nicht das Gegenteil von Dekodieren.

Groß- und Kleinschreibung in den Hexziffern

`%3A` und `%3a` bezeichnen dasselbe Byte, und jeder Dekodierer nimmt beide. RFC 3986 empfiehlt Großbuchstaben, und die meisten Kodierer erzeugen sie auch, aber verbindlich ist es nicht.

Relevant wird es nur beim Vergleich zweier URLs als Zeichenketten — etwa als Cache-Schlüssel oder in einer Signatur. Zwei Adressen, die sich nur in der Schreibweise ihrer Hexziffern unterscheiden, sind dieselbe Adresse und zwei verschiedene Zeichenketten, und das ist eine der stilleren Ursachen für einen Cache, der nie trifft.

Was in einem Query-String nichts zu suchen hat

Ein Query-String wird protokolliert. Er steht im Zugriffsprotokoll jedes Servers und jedes Proxys, den die Anfrage passiert hat, im Verlauf des Browsers, im Referrer-Header an die nächste Seite und häufig in einem Analytics-Datensatz. Nichts daran ist flüchtig.

Ein Token, ein Zurücksetzungscode, eine Sitzungskennung oder eine E-Mail-Adresse in einem Query-String ist damit an mehreren Stellen aufgezeichnet worden, die niemand beabsichtigt hat. Es passiert ständig — Links zum Zurücksetzen von Passwörtern sind der Klassiker —, und ein dekodierter Query-String ist oft der Moment, in dem es jemandem auffällt.

Warum ausgerechnet das lokal bleibt

URLs aus Logs tragen Sitzungskennungen, Tokens an Stellen, an denen sie nicht sein sollten, Suchbegriffe und oft genug eine E-Mail-Adresse. Das ist dieselbe Kategorie wie die Tokens auf der Base64-Seite und verdient dieselbe Behandlung.

Hier wird nichts hochgeladen. Das Dekodieren sind ein paar Zeilen Rechnerei in der Seite, die du gerade liest, und das Netzwerk-Panel ist die Art, das zu bestätigen, statt einem Satz auf einer Marketingseite zu glauben.

URL dekodieren: häufige Fragen

Warum enthält mein Ergebnis noch Prozentzeichen?

Weil die Zeichenkette zweimal kodiert war. Achte auf %25, ein kodiertes Prozentzeichen — noch einmal dekodieren gibt den echten Text. Es lohnt sich nachzuverfolgen, woher die zweite Kodierung kam, denn das ist meist ein Framework und eine Vorlage, die denselben Wert beide maskieren.

Soll ein + zu einem Leerzeichen werden?

In einem Query-String fast immer ja — das schreibt die HTML-Formularkodierung so vor, und das sind die meisten Query-Strings. In einem Pfad oder in einem Wert, der legitim ein Plus enthalten kann, etwa eine Telefonnummer oder eine Suche nach C++, nein. Aus der Zeichenkette selbst geht nicht hervor, welcher Fall vorliegt.

Es meldet eine fehlerhafte Sequenz. Was heißt das?

Dass die Bytes hinter den Prozentsequenzen keine gültigen UTF-8-Zeichen ergeben — meist weil die Zeichenkette mitten in einem Mehrbyte-Zeichen abgeschnitten wurde oder weil etwas Altes sie als Latin-1 kodiert hat. In diesem Fall gibt es keine richtige Ausgabe, also wird das Problem gemeldet statt eine erfunden.

Kommt es mit nicht-lateinischer Schrift zurecht?

Ja. Die Sequenzen werden zu UTF-8 zusammengesetzt, bevor daraus Zeichen werden, Kyrillisch, Devanagari, CJK und Emoji kommen also unversehrt zurück. Ein Dekodierer, der Sequenz für Sequenz arbeitet, erzeugt für all das Mojibake — das ist die häufigste Art, wie das schiefgeht.

Wird das, was ich einfüge, gespeichert oder protokolliert?

Weder noch. Es verlässt deinen Browser nicht, es gibt hier also nichts zu speichern. Gerade bei diesem Werkzeug ist das etwas wert: URLs aus Logfiles tragen regelmäßig Sitzungskennungen, Tokens und Suchbegriffe, die nie für Dritte gedacht waren.

Weitere Werkzeuge