Qué hace la codificación porcentual
Una URL solo puede contener un conjunto limitado de caracteres ASCII, y algunos de ellos (/, ?, &, =, #) tienen significado estructural. Cualquier otro byte se escribe como un signo de porcentaje y dos dígitos hex: un espacio es %20, & es %26, y los bytes UTF-8 de é son %C3%A9. El RFC 3986 fija las reglas.
Tres modos, porque el contexto importa
| Modo | Escapa | Conserva | Úsalo cuando |
|---|---|---|---|
| Componente de query | Todo salvo A–Z a–z 0–9 - _ . ~ | Solo caracteres no reservados | Un valor va dentro de un parámetro de query o un segmento de ruta: ?q=…. Equivale a encodeURIComponent. |
| URL completa | Espacios, no ASCII, comillas, < >… | : / ? # [ ] @ & = + $ , ; | Hay que sanear una URL completa sin romper su estructura. Equivale a encodeURI. |
| Datos de formulario | Como componente, pero el espacio se convierte en + | Cuerpos de formularios HTML (application/x-www-form-urlencoded), lo que la mayoría de las bibliotecas HTTP envían por defecto. |
El error más común es aplicar la codificación de URL completa a un valor que contiene & o =: el servidor parte el parámetro en dos. Codifica los valores con las reglas de componente y júntalos después.
Signos más
En el cuerpo de un formulario (y por convención en el query string), + significa espacio, así que decodificar datos de formulario tiene que convertir + en espacio, mientras que un más real debe haberse enviado como %2B. En una ruta, + es simplemente un más. El interruptor Decodificar + como espacio cubre ambos casos.
Doble codificación
Si ves %2520 en una URL, algo codificó una cadena ya codificada: %20 se trató como texto y su % se convirtió en %25. Decodificar dos veces recupera el original; luego arregla el código que codificó dos veces.
Preguntas
¿Qué es %20?
Un espacio. 0x20 es el código ASCII del espacio, así que la codificación porcentual lo escribe como %20. En datos de formulario puede aparecer como + en su lugar.
¿Cuál es la diferencia entre encodeURI y encodeURIComponent?
encodeURIComponent escapa todo carácter que pueda ser estructural (incluidos /, ?, & y =) y es para valores sueltos. encodeURI los deja en paz para que una URL completa siga siendo una URL. Usa el modo componente de query para lo primero y URL completa para lo segundo.
¿Cómo se codifican las tildes y otros caracteres especiales?
Como los bytes de su forma UTF-8, cada uno escrito como %XX. é son dos bytes (%C3%A9), 日 son tres (%E6%97%A5). Los sistemas antiguos usaban a veces Latin-1, lo que da %E9 para é; los navegadores y API modernos usan UTF-8.
¿Por qué falla la decodificación de mi cadena?
O bien un % no va seguido de dos dígitos hex (un signo de porcentaje literal debe escribirse %25), o bien los bytes escapados no forman UTF-8 válido. El mensaje de error dice cuál es el caso.
¿Debo codificar la URL entera o solo los parámetros?
Solo los parámetros (y cualquier segmento de ruta que contenga texto del usuario). Construye la URL a partir de partes ya codificadas para que los delimitadores queden sin escapar.