Como Corrigir Erros "URI Malformed" em JavaScript
Resolva e corrija o erro comum "URIError: URI malformed" em JavaScript com soluções práticas.
Entendendo o Erro URIError: URI Malformed
O erro URIError: URI malformed ocorre em JavaScript quando você tenta decodificar uma string que contém sequências percent-encoded inválidas. Esse erro é lançado por decodeURI() ou decodeURIComponent() quando eles encontram um caractere codificado malformado.
Causas Comuns
1. Sinais de Porcentagem Isolados
Um sinal de porcentagem (%) que não é seguido por exatamente dois dígitos hexadecimais é inválido. Por exemplo, %, %G ou %2 (incompleto) causarão todos esse erro.
// Estes lançarão URIError
decodeURIComponent('%'); // % isolado
decodeURIComponent('%2'); // Sequência incompleta
decodeURIComponent('%GH'); // Dígitos hexadecimais inválidos
decodeURIComponent('100%'); // % no final sem dígitos hexadecimais
2. Sequências UTF-8 Inválidas
Quando os bytes percent-encoded não formam uma sequência de caracteres UTF-8 válida, o decodificador não consegue convertê-los em uma string. Isso pode acontecer quando os dados estão corrompidos ou foram codificados usando uma codificação de caracteres diferente.
3. Codificação Dupla
A codificação dupla ocorre quando uma string já codificada é codificada novamente. Por exemplo, %20 (espaço codificado) é codificado como %2520. Quando você tenta decodificar a string original, as sequências podem ser inválidas.
Como Corrigir
Solução 1: Use try-catch
function safeDecode(str) {
try {
return decodeURIComponent(str);
} catch (e) {
// Retorna a string original se a decodificação falhar
console.warn('Failed to decode:', str, e.message);
return str;
}
}
Solução 2: Valide Antes de Decodificar
function isValidEncodedURI(str) {
try {
decodeURIComponent(str);
return true;
} catch {
return false;
}
}
function fixMalformedURI(str) {
// Substitui % isolado por %25 (porcentagem codificada)
return str.replace(/%(?![0-9A-Fa-f]{2})/g, '%25');
}
Solução 3: Evite a Codificação Dupla
function smartEncode(str) {
// Primeiro tenta decodificar - se tiver sucesso, a string
// já está codificada
try {
const decoded = decodeURIComponent(str);
// Se a decodificação alterou a string, ela estava codificada
if (decoded !== str) {
return str; // Já está codificada, retorna como está
}
} catch {
// Não é uma string codificada válida, então codifica
}
return encodeURIComponent(str);
}
Boas Práticas de Prevenção
- Sempre use try-catch ao decodificar URLs fornecidas por usuários ou externas
- Valide as URLs antes de processá-las
- Tenha cuidado para não codificar valores duas vezes
- Use as APIs URL e URLSearchParams sempre que possível -- elas tratam a codificação corretamente
- Sanitize os valores da query string antes de codificar
- Registre URLs malformadas para fins de depuração