如何decode url,(被多次encode)

金鱼我在这 2014-08-12 06:06:45
在javascript中,如何判断一个被多次encode 的url 已经被decode到原来的格式?

问题1: 使用decodeURIComponent. 可以循环多次使用这个方法,直到字符不再变化吗? 有需要注意的特别字符吗? 我发现

“+” 要用“%20”替换(可以每调用一次这个方法检查替换一次。)
“%”这个比较头疼: 如下 这个rul

http%253A%252F%252Fpixel.everesttech.net%252F2813%252Fcq%253Fev_sid%253D3%2526ev_ln%253D{keyword}%2526ev_crx%253D{creative}%2526ev_mt%253D{matchtype}%2526ev_n%253D{network}%2526ev_ltx%2526ev_pl%253D{placement}%2526url%253Dhttp%25253A%252F%252Fnyacuradealers.com%252FNew-York%252FDealer%252FNew%252FAcura%252FRDX%252F&mkwid={ifsearch:s}{ifcontent:c}Kx4fp674_d{device}&pkw={keyword}&pmt={MatchType}&utm_source=Tier10&utm_medium=ppc&utm_campaign=Toyota%20Comp.%20Conquest-%2021%25

解压一次之后
http%3A%2F%2Fpixel.everesttech.net%2F2813%2Fcq%3Fev_sid%3D3%26ev_ln%3D{keyword}%26ev_crx%3D{creative}%26ev_mt%3D{matchtype}%26ev_n%3D{network}%26ev_ltx%26ev_pl%3D{placement}%26url%3Dhttp%253A%2F%2Fnyacuradealers.com%2FNew-York%2FDealer%2FNew%2FAcura%2FRDX%2F&mkwid={ifsearch:s}{ifcontent:c}Kx4fp674_d{device}&pkw={keyword}&pmt={MatchType}&utm_source=Tier10&utm_medium=ppc&utm_campaign=Toyota Comp. Conquest- 21%

然后继续解压会出现异常: 最后的&utm_campaign=Toyota Comp. Conquest- 21% 已经被解码好了,但是 前面的部分还没有解码好。继续使用decodeURIComponent, %会导致问题。

如果 “%”替换成“%25”, 问题在于无法定位,也不知道该在地几次使用decodeURIComponent之后替换(这样才能保证前后两部分的加密次数是同步的,最终被正确的解码出来)
...全文
1272 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
步慢生错 2014-08-12
  • 打赏
  • 举报
回复
引用 5 楼 liuhuan_tao 的回复:
需求很简单,因为会有人为修改URL的情况。所以,URL的参数部分有可能是后来被修改过的,所以无法保证前面部分encode了多少次,后面部分encode了多少次,现在需要把这个URL前部decode,用作分析,就出现了上述为题。(参数部分&utm_medium=ppc&utm_campaign=Toyota Comp. Conquest- 21%, 因为这个% 而不能被无限次decodeURIComponent)
你真的想这么摆弄url的话,我觉得可以做冗余校验,就是最初设一个能被编码特殊字符串,每次解码时候indexOf判断有没解码出这个特殊字符串。仅供参考
金鱼我在这 2014-08-12
  • 打赏
  • 举报
回复
需求很简单,因为会有人为修改URL的情况。所以,URL的参数部分有可能是后来被修改过的,所以无法保证前面部分encode了多少次,后面部分encode了多少次,现在需要把这个URL前部decode,用作分析,就出现了上述为题。(参数部分&utm_medium=ppc&utm_campaign=Toyota Comp. Conquest- 21%, 因为这个% 而不能被无限次decodeURIComponent)
步慢生错 2014-08-12
  • 打赏
  • 举报
回复
看成json力encode了 不过你要弄得URL这么复杂的话,是考虑方向错了吧。先说说要这么做是什么需求
jiang123456yi 2014-08-12
  • 打赏
  • 举报
回复
Base64Util.encode(string.getBytes("utf-8")).toString();这是我在url中的加密方法,一般情况下是不需要加密的,出现汉字感觉是不行。
步慢生错 2014-08-12
  • 打赏
  • 举报
回复
额。。不是加反斜杠,是替换成html编码字符
步慢生错 2014-08-12
  • 打赏
  • 举报
回复
用utf8格式传数据一了百了,不需要encode(另外可以自己写个给关键字“ ‘ 之类加反斜杠和取消反斜杠的函数)

87,917

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧