Débogage7 min de lecture

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

Articles connexes

Essayez nos outils gratuits