如何知道URL是否被解码/编码?

时间:2013-07-10 07:31:47

标签: javascript urlencode urldecode

我正在使用Javascript方法decodeURIComponent来解码编码的网址。现在我遇到了一个问题,有时在服务器之间重定向期间URL被编码两次,有时它只被编码一次。

我想在调用方法decodeURIComponent后检查URL是否仍然是编码的。我怎样才能做到这一点?任何指针都对我很有帮助。

更新 - 1

如果我递归调用一个方法并检查给定的URL是否仍然包含“%”,如果它包含“%”,则解码它并再次调用该方法;如果没有将它返回给调用者,那会起作用吗?

更新 - 2

对于我的情况,我有:

callBackUrl=http%253A%252F%252Fadbc.com%252FPOSM%252Fapp%252Fpages%252Fadf.task-flow%253Fadf.tfDoc%253D%25252FWEB-INF%25252Ftask-flows%25252Fcatalog-edit-task-flow.xml%2526adf.tfId%253Dcatalog%2526_adf.ctrl-state%253Db9akorh22_9%2526articleReference%253D10C00135%2526previousView%253Dcatalog-home%2526fromUCM%253Dtrue%2526articleType%253Dposm%2526developer%253Dcentral

现在我在我的js方法中获取callBackUrl的值,然后对其进行解码并使用该解码的URL触发window.open()。参数相同,它有:

  • adf.tfDoc
  • adf.tfId
  • articleReference
  • previousView
  • fromUCM
  • articleType
  • 显影剂

参数进入它。所以我知道没有像value="%.."这样的查询字符串。

更新 - 3

我写了以下方法:

var decodeURLRecursively = function(url) {
    if(url.indexOf('%') != -1) {
        return decodeURLRecursively(decodeURIComponent(url));
    }

    return url;
}

5 个答案:

答案 0 :(得分:21)

如果对URL字符串进行编码,有一种简单的方法可以解决。

获取初始字符串并将其与解码结果进行比较。如果结果相同,则不对字符串进行编码;如果结果不同则编码。

我的网址存在此问题,我使用了此功能:

function isEncoded(uri) {
  uri = uri || '';

  return uri !== decodeURIComponent(uri);
}

所以现在我可以使用isEncoded作为while循环(或递归)中的判别式来知道我是否需要继续在字符串上调用decodeURIComponent

function fullyDecodeURI(uri){

  while (isEncoded(uri)){
    uri = decodeURIComponent(uri);
  }

  return uri;
}

这解决了我多次解码编码网址的问题。希望这会有所帮助。

答案 1 :(得分:7)

重复解码,直到找不到%符号,将在99%以上的时间内正常工作。只要找到/%[0-9a-f]{2}/i的匹配项就可以反复拨打电话,效果会更好。

但是,如果我(由于一些奇怪的原因)命名文件100%achieved,这会导致问题,因为%ac将被解码为¬,从而导致解码失败。不幸的是,没有办法检测到这种情况。

理想情况下,您应该知道某些事物是否被编码不止一次,并且最好不要让它首先发生。

答案 2 :(得分:1)

你可以保持解码,直到字符串没有改变:

LocalBroadcastManager.getInstance(this).registerReceiver(myLocalBroadcastManager, new IntentFilter(Constant.CONNECTIVITY_CHANGE));

答案 3 :(得分:0)

function checkEncodeURI(str) {
 return /\%/i.test(str)
}

测试:

let url1 = "https://quora.com/unanswered/I’m-looking-for-a-Freaks-And-Friends-Fox-Glitter-Face-Hinge-Wallet-for-a-Christmas-gift-I’ve-searched-for-hours-online-but-no-one-seemed-to-have-it-does-anyone-know-where-I-can-find-one"
let url2 = 'https://www.quora.com/unanswered/I%E2%80%99m-looking-for-a-Freaks-And-Friends-Fox-Glitter-Face-Hinge-Wallet-for-a-Christmas-gift-I%E2%80%99ve-searched-for-hours-online-but-no-one-seemed-to-have-it-does-anyone-know-where-I-can-find-one'
let a = checkEncodeURI(url1)
console.log(a)
let b = checkEncodeURI(url2)
console.log(b)

答案 4 :(得分:0)

有一种非常简单,快速且值得信赖的方法来知道URL字符串是否已编码。

例如: encodeURIComponent(decodeURIComponent(encodeURIComponent(“ SWQgPSA0NjI%3D”)))<>“ SWQgPSA0NjI =” ---->不等于原始值,已经编码

仅此代码:

  var encValue = encodeURIComponent(Value);
    try {
         if (decodeURIComponent(decodeURIComponent(encValue)) === Value) {
          //not encodec yet...so return encoded of val
          return encValue;
         }
       } catch (err) {
           //not encodec yet...so return encoded of val
           return encValue;
       }

 return Value  //same value returned