decodeURI没有完全正常工作

时间:2012-07-04 06:37:25

标签: javascript jquery

我正在尝试从链接中删除URI编码,但decodeURI似乎没有完全正常工作。

我的示例链接是:/linkout?remoteUrl=http%253a%252f%252fsandbox.yoyogames.com%252fgames%252f171985-h-a-m-heroic-armies-marching

运行JavaScript脚本后,它看起来像这样:

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

如何摆脱URI中剩余的不正确的代码?

我的解码代码:

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

3 个答案:

答案 0 :(得分:29)

url看起来像编码两次,我还建议使用decodeURIComponent

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

导致: “http://sandbox.yoyogames.com/games/171985-h-a-m-heroic-armies-marching”

但你应该检查你为什么要提前两次编码网址

答案 1 :(得分:1)

我刚刚在PUT动词的ASHX处理程序中遇到过这种情况。 ASP.NET显然是为我编码我的XML,所以不需要我的服务器端调用 HttpUtility.UrlEncode 。通过调用客户端Javascript decodeURI 两次修复它 - 在奶牛离开后关闭谷仓门,我发送的HTTP是违反协议的。

我会对Tobias Krogh的回答发表评论并加上其他人的答案,但我没有这样的观点......

但是,我仍然认为重要的是要注意这里讨论的失败不是Javascript decodeURI或其他任何东西 - 这是一个数据验证错误。

答案 2 :(得分:0)

我的实现是一个递归函数:

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:编码的字符串。
  • maxInterations:尝试解码str的最大递归迭代次数(默认值:30 )。
  • iterations:标志计数器迭代。