Lección 3

encodeURI frente a encodeURIComponent

Helpers de JavaScript y cuándo usar cada uno en paths o valores de query.

JavaScript expone dos funciones globales con nombres casi idénticos pero conjuntos distintos de caracteres que dejan sin escapar. Ambas apuntan a texto URI, pero asumen ámbitos de datos diferentes.

encodeURIComponent codifica «un solo componente»

Úsala para valores de query, segmentos de path, identificadores de fragmento y cualquier cadena que no deba inyectar estructura:

encodeURIComponent("a/b?c=1&d=2");
// "a%2Fb%3Fc%3D1%26d%3D2"

Observa que /, ?, & y = se convierten en escapes porcentuales para que el valor permanezca opaco cuando se incrusta.

Patrón típico al construir una query string manualmente:

const q = new URLSearchParams({
  title: "Q&A / Notes",
  next: "https://example.com/a?x=1",
});
q.toString(); // title=Q%26A+%2F+Notes&next=https%3A%2F%2Fexample.com%2Fa%3Fx%3D1
// (Note: URLSearchParams uses application/x-www-form-urlencoded rules; + for space)

Para cadenas montadas a mano, prefiere URLSearchParams o bibliotecas que ya gestionen los caracteres separadores.

encodeURI preserva los delimitadores URI

encodeURI asume que pasas una URI casi completa y solo necesitas corregir caracteres ilegales a nivel global manteniendo la puntuación estructural con significado:

encodeURI("https://example.com/résumé?id=1#top");
// https://example.com/r%C3%A9sum%C3%A9?id=1#top

No codifica caracteres como ?, # o / cuando aparecen — porque cree que pueden ser delimitadores reales. Eso es peligroso si tu «dato» incluye esos símbolos.

encodeURI("https://example.com/search?q=a/b");
// leaves the slash—may break server expectations if / was data, not a path separator

Regla práctica: no uses encodeURI para proteger texto arbitrario de usuario; usa encodeURIComponent (o APIs de nivel superior) por componente.

Guía rápida de decisión

SituaciónHelper preferido
Un segmento de path que contiene / como datoencodeURIComponent en cada segmento
URL completa del usuario con delimitadores desconocidosAnalizar con URL, luego codificar cada parte
URI ya estructuralmente correcta, solo fallan acentosPosiblemente encodeURI — a menudo sigue siendo más claro normalizar host/path por separado
Construcción repetida de APIsPreferir URL + URLSearchParams, no concatenación

decodeURI frente a decodeURIComponent

Se aplican las mismas precauciones simétricas:

decodeURIComponent("100%2525"); // may yield "100%25" if only one decoding pass—but mind double-encoding bugs upstream
decodeURI("http://host/%7Euser") → keeps delimiters untouched while decoding escapes in other positions

Si mezclas ámbitos de codificación/decodificación, el texto decodificado puede reintroducir separadores (&, ?) que cambian cómo se analizan los parámetros — trampas clásicas de open redirect o bypass de filtros cuando se reflejan en HTML o cabeceras.

Prueba distintos ámbitos de codificación en el Codificador / Decodificador URL antes de depurar redirects o callbacks OAuth.

Volver al resumen del curso