Comment corriger les erreurs « URI malformed » en JavaScript
Diagnostiquez et corrigez l'erreur courante « URIError: URI malformed » en JavaScript grâce à des solutions concrètes.
Comprendre l'erreur URIError : URI malformed
L'erreur URIError: URI malformed se produit en JavaScript lorsque vous tentez de décoder une chaîne contenant des séquences percent-encoded invalides. Cette erreur est levée par decodeURI() ou decodeURIComponent() lorsqu'ils rencontrent un caractère encodé mal formé.
Causes fréquentes
1. Signes pourcentage isolés
Un signe pourcentage (%) qui n'est pas suivi d'exactement deux chiffres hexadécimaux est invalide. Par exemple, %, %G ou %2 (incomplet) provoqueront tous cette erreur.
// Ces appels lèveront une URIError
decodeURIComponent('%'); // % isolé
decodeURIComponent('%2'); // Séquence incomplète
decodeURIComponent('%GH'); // Chiffres hexadécimaux invalides
decodeURIComponent('100%'); // % en fin de chaîne sans chiffres hexadécimaux
2. Séquences UTF-8 invalides
Lorsque les octets percent-encoded ne forment pas une séquence de caractères UTF-8 valide, le décodeur ne peut pas les convertir en chaîne. Cela peut arriver lorsque les données sont corrompues ou ont été encodées avec un autre encodage de caractères.
3. Double encodage
Le double encodage se produit lorsqu'une chaîne déjà encodée est encodée une nouvelle fois. Par exemple, %20 (espace encodé) devient %2520. Lorsque vous essayez de décoder la chaîne d'origine, les séquences peuvent être invalides.
Comment corriger le problème
Solution 1 : utiliser try-catch
function safeDecode(str) {
try {
return decodeURIComponent(str);
} catch (e) {
// Renvoie la chaîne d'origine si le décodage échoue
console.warn('Failed to decode:', str, e.message);
return str;
}
}
Solution 2 : valider avant de décoder
function isValidEncodedURI(str) {
try {
decodeURIComponent(str);
return true;
} catch {
return false;
}
}
function fixMalformedURI(str) {
// Remplace un % isolé par %25 (pourcentage encodé)
return str.replace(/%(?![0-9A-Fa-f]{2})/g, '%25');
}
Solution 3 : éviter le double encodage
function smartEncode(str) {
// On essaie d'abord de décoder : si cela réussit,
// la chaîne est déjà encodée
try {
const decoded = decodeURIComponent(str);
// Si le décodage a modifié la chaîne, c'est qu'elle était encodée
if (decoded !== str) {
return str; // Déjà encodée, renvoyée telle quelle
}
} catch {
// Chaîne encodée non valide, on l'encode
}
return encodeURIComponent(str);
}
Bonnes pratiques de prévention
- Utilisez toujours try-catch lors du décodage d'URL fournies par l'utilisateur ou provenant de sources externes
- Validez les URL avant de les traiter
- Veillez à ne pas encoder les valeurs deux fois
- Utilisez les API URL et URLSearchParams lorsque c'est possible : elles gèrent correctement l'encodage
- Assainissez les valeurs des chaînes de requête avant de les encoder
- Journalisez les URL mal formées pour faciliter le débogage