Depuração7 min de leitura

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

Artigos relacionados

Experimente as nossas ferramentas gratuitas