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