decodeURI no funciona completamente

3 minutos de lectura

avatar de usuario
ixchi

Estoy tratando de eliminar la codificación URI de un enlace, pero parece que decodeURI no funciona completamente.

Mi enlace de ejemplo es este: /linkout?remoteUrl=http%253a%252f%252fsandbox.yoyogames.com%252fgames%252f171985-h-a-m-heroic-armies-marching

Después de ejecutar el script de JavaScript, se ve así:

http%3a%2f%2fsandbox.yoyogames.com%2fgames%2f171985-h-a-m-heroic-armies-marching

¿Cómo puedo deshacerme de los códigos incorrectos restantes en el URI?

Mi código de decodificación:

var href = $(this).attr('href');            // get the href
var href = decodeURI(href.substring(19));   // remove the outgoing part and remove the escaping
$(this).attr('href', 'http://'+href)        // change link on page

  • use decodeURIComponent() en su lugar

    – Dano

    4 de julio de 2012 a las 6:41

  • Tenga en cuenta también que construir el objeto “$(this)” dos veces en un solo paso de ejecución no es una buena idea, así que colóquelo en caché una vez al comienzo de la función y use el objeto almacenado en caché cuando sea necesario.

    – Joe Banco

    4 de julio de 2012 a las 6:48

  • $(this).attr('href') es solo una forma más larga y lenta de escribir this.href.

    – RobG

    4 de julio de 2012 a las 6:53

la URL se ve como si estuviera codificada dos veces, también sugiero usar decodeURIComponent

decodeURIComponent(decodeURIComponent("http%253a%252f%252fsandbox.yoyogames.com%252fgames%252f171985-h-a-m-heroic-armies-marching"))

da como resultado: “http://sandbox.yoyogames.com/games/171985-ham-heroic-armies-marching”

pero debe verificar por qué tiene la url codificada dos veces por adelantado

  • -.- me perdí al volver a sangrar… gracias por la pista 🙂 comentario +1

    –Tobias Krogh

    4 de julio de 2012 a las 6:43

  • No es mi sitio web para el que estoy escribiendo este código, es para un UserScript. No tengo idea de por qué están codificando dos veces el URI, les preguntaré en algún momento.

    – ixchi

    4 de julio de 2012 a las 6:45

  • de todos modos, hacer decodeURIComponent dos veces debería resolver su problema 🙂

    –Tobias Krogh

    4 de julio de 2012 a las 8:46

Acabo de encontrarme con esta situación en un controlador ASHX para el verbo PUT. ASP.NET aparentemente está codificando mi XML para mí, por lo que mi llamada del lado del servidor a HttpUtility.UrlEncode no era necesario. Arreglarlo llamando a Javascript del lado del cliente decodificarURI dos veces: está cerrando la puerta del establo después de que las vacas ya se han ido y el HTTP que estaba enviando era una violación del protocolo.

Habría comentado y añadido la respuesta de Tobias Krogh, pero no tengo los puntos para hacerlo…

Sin embargo, sigo pensando que es importante tener en cuenta que la falla que se analiza aquí no es un decodeURI de Javascript ni nada más, es un error de validación de datos.

Mi implementación es una función recursiva:

export function tryDecodeURLComponent(str: string, maxInterations = 30, iterations = 0): string {
    if (iterations >= maxInterations) {
        return str;
    } else if (typeof str === 'string' && (str.indexOf('%3D') !== -1 || str.indexOf('%25') !== -1)) {
        return tryDecodeURLComponent(decodeURIComponent(str), maxInterations, iterations + 1)
    }

    return decodeURIComponent(str);
}
  • str: cadena codificada.
  • maxInterations: Máximo de iteraciones recursivas para intentar decodificar str (defecto: 30).
  • iterations: Iteración de contador de banderas.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad