Debugging7 Min. Lesezeit

So beheben Sie "URI Malformed"-Fehler in JavaScript

Beheben Sie den häufigen Fehler "URIError: URI malformed" in JavaScript mit praxisnahen Lösungen.

Den Fehler URIError: URI Malformed verstehen

Der Fehler URIError: URI malformed tritt in JavaScript auf, wenn Sie versuchen, eine Zeichenkette zu dekodieren, die ungültige prozentkodierte Sequenzen enthält. Dieser Fehler wird von decodeURI() oder decodeURIComponent() ausgelöst, sobald sie auf ein fehlerhaft kodiertes Zeichen stoßen.

Häufige Ursachen

1. Einzelne Prozentzeichen

Ein Prozentzeichen (%), auf das nicht genau zwei hexadezimale Ziffern folgen, ist ungültig. Beispielsweise führen %, %G oder %2 (unvollständig) allesamt zu diesem Fehler.

// Diese lösen einen URIError aus
decodeURIComponent('%');        // Einzelnes %
decodeURIComponent('%2');       // Unvollständige Sequenz
decodeURIComponent('%GH');      // Ungültige Hex-Ziffern
decodeURIComponent('100%');     // % am Ende ohne Hex-Ziffern

2. Ungültige UTF-8-Sequenzen

Wenn die prozentkodierten Bytes keine gültige UTF-8-Zeichensequenz ergeben, kann der Decoder sie nicht in eine Zeichenkette umwandeln. Das kann passieren, wenn Daten beschädigt sind oder mit einer anderen Zeichenkodierung kodiert wurden.

3. Doppelte Kodierung

Eine doppelte Kodierung entsteht, wenn eine bereits kodierte Zeichenkette erneut kodiert wird. So wird zum Beispiel aus %20 (kodiertes Leerzeichen) %2520. Wenn Sie dann versuchen, die ursprüngliche Zeichenkette zu dekodieren, können die Sequenzen ungültig sein.

So beheben Sie den Fehler

Lösung 1: try-catch verwenden

function safeDecode(str) {
  try {
    return decodeURIComponent(str);
  } catch (e) {
    // Gib die ursprüngliche Zeichenkette zurück, wenn das Dekodieren fehlschlägt
    console.warn('Failed to decode:', str, e.message);
    return str;
  }
}

Lösung 2: Vor dem Dekodieren validieren

function isValidEncodedURI(str) {
  try {
    decodeURIComponent(str);
    return true;
  } catch {
    return false;
  }
}

function fixMalformedURI(str) {
  // Ersetze einzelne % durch %25 (kodiertes Prozentzeichen)
  return str.replace(/%(?![0-9A-Fa-f]{2})/g, '%25');
}

Lösung 3: Doppelte Kodierung verhindern

function smartEncode(str) {
  // Versuche zuerst zu dekodieren – wenn es gelingt, ist die
  // Zeichenkette bereits kodiert
  try {
    const decoded = decodeURIComponent(str);
    // Wenn sich die Zeichenkette durch das Dekodieren geändert hat, war sie kodiert
    if (decoded !== str) {
      return str; // Bereits kodiert, unverändert zurückgeben
    }
  } catch {
    // Keine gültige kodierte Zeichenkette, also kodieren
  }
  return encodeURIComponent(str);
}

Bewährte Praktiken zur Vermeidung

  • Verwenden Sie beim Dekodieren von benutzergenerierten oder externen URLs immer try-catch
  • Validieren Sie URLs, bevor Sie sie verarbeiten
  • Achten Sie darauf, Werte nicht doppelt zu kodieren
  • Nutzen Sie nach Möglichkeit die APIs URL und URLSearchParams – sie handhaben die Kodierung korrekt
  • Bereinigen Sie Query-String-Werte, bevor Sie sie kodieren
  • Protokollieren Sie fehlerhafte URLs zu Debugging-Zwecken

Verwandte Artikel

Testen Sie unsere kostenlosen Tools