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