Debugging7 min di lettura

Come risolvere gli errori "URI Malformed" in JavaScript

Diagnostica e risolvi il comune errore "URIError: URI malformed" in JavaScript con soluzioni pratiche.

Comprendere l'errore URIError: URI Malformed

L'errore URIError: URI malformed si verifica in JavaScript quando si tenta di decodificare una stringa che contiene sequenze percent-encoded non valide. Questo errore viene sollevato da decodeURI() o decodeURIComponent() quando incontrano un carattere codificato in modo errato.

Cause comuni

1. Segni di percentuale isolati

Un segno di percentuale (%) che non è seguito esattamente da due cifre esadecimali non è valido. Ad esempio, %, %G o %2 (incompleto) causeranno tutti questo errore.

// Questi genereranno un URIError
decodeURIComponent('%');        // % isolato
decodeURIComponent('%2');       // Sequenza incompleta
decodeURIComponent('%GH');      // Cifre esadecimali non valide
decodeURIComponent('100%');     // % alla fine senza cifre esadecimali

2. Sequenze UTF-8 non valide

Quando i byte percent-encoded non formano una sequenza di caratteri UTF-8 valida, il decodificatore non è in grado di convertirli in una stringa. Questo può accadere quando i dati sono corrotti o sono stati codificati utilizzando una diversa codifica dei caratteri.

3. Doppia codifica

La doppia codifica si verifica quando una stringa già codificata viene codificata di nuovo. Ad esempio, %20 (spazio codificato) viene codificato in %2520. Quando si tenta di decodificare la stringa originale, le sequenze potrebbero risultare non valide.

Come risolverlo

Soluzione 1: usare try-catch

function safeDecode(str) {
  try {
    return decodeURIComponent(str);
  } catch (e) {
    // Restituisce la stringa originale se la decodifica fallisce
    console.warn('Failed to decode:', str, e.message);
    return str;
  }
}

Soluzione 2: validare prima di decodificare

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

function fixMalformedURI(str) {
  // Sostituisce il % isolato con %25 (percentuale codificata)
  return str.replace(/%(?![0-9A-Fa-f]{2})/g, '%25');
}

Soluzione 3: prevenire la doppia codifica

function smartEncode(str) {
  // Prova prima a decodificare: se ha successo, la stringa
  // è già codificata
  try {
    const decoded = decodeURIComponent(str);
    // Se la decodifica ha modificato la stringa, era codificata
    if (decoded !== str) {
      return str; // Già codificata, la restituisce così com'è
    }
  } catch {
    // Non è una stringa codificata valida, la codifica
  }
  return encodeURIComponent(str);
}

Buone pratiche di prevenzione

  • Usa sempre try-catch quando decodifichi URL forniti dagli utenti o provenienti da fonti esterne
  • Valida gli URL prima di elaborarli
  • Fai attenzione a non codificare due volte i valori
  • Usa le API URL e URLSearchParams quando possibile: gestiscono la codifica correttamente
  • Sanifica i valori delle query string prima di codificarli
  • Registra gli URL malformati per il debugging

Articoli correlati

Prova i nostri strumenti gratuiti