Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/417.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何知道URL是否已解码/编码?_Javascript_Urlencode_Urldecode - Fatal编程技术网

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

Javascript 如何知道URL是否已解码/编码?,javascript,urlencode,urldecode,Javascript,Urlencode,Urldecode,我正在使用Javascript方法decodeURIComponent对编码的URL进行解码。现在我遇到了一个问题,有时URL在服务器之间重定向时会被编码两次,有时只编码一次 我想检查调用方法decodeURIComponent后URL是否仍然编码。我该怎么做?任何指针都会对我很有帮助 更新-1 如果我递归调用一个方法并检查给定的URL是否仍然包含“%”,如果它包含“%”,则对其进行解码并再次调用该方法;如果不把它还给打电话的人,这行吗 更新-2 就我的情况而言,我有: callBackUrl=

我正在使用Javascript方法
decodeURIComponent
对编码的URL进行解码。现在我遇到了一个问题,有时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
  • 文章参考
  • 先前的观点
  • 弗洛姆
  • 文章类型
  • 显影剂
参数输入其中。所以我知道没有像
value=“%..”
这样的查询字符串

更新-3 我编写了以下方法:

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

    return url;
}

反复解码,直到您没有找到
%
符号为止,将在99%的时间内有效。只要能找到
/%[0-9a-f]{2}/i
的匹配项,重复调用就会更好

但是,如果我(出于某种奇怪的原因)命名一个文件
100%实现
,这将导致一个问题,因为
%ac
将被解码为
,导致解码失败。不幸的是,没有办法发现这个病例


理想情况下,您应该知道某个内容是否被多次编码,最好不要让它发生在第一时间。

有一种简单的方法可以知道URL字符串是否被编码

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

我的URL有这个问题,我使用了以下功能:

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

  return uri !== decodeURIComponent(uri);
}
因此,现在我可以使用
isEncoded
作为while循环(或递归)中的鉴别器,以了解是否需要继续调用字符串上的
decodeURIComponent

function fullyDecodeURI(uri){

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

  return uri;
}
这解决了我对多次编码的URL进行解码的问题。希望这有帮助

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)

您可以一直解码,直到字符串没有更改:

str = "xxxxxxx"
dec_str = decode(str)
while(dec_str != str)
     str = dec_str;
     dec_str = decode(str);

有一种简单、快速、可靠的方法可以知道URL字符串是否已编码

例如: decodeURIComponent(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

                        

这似乎是一个需要在服务器上解决的问题,而不是在前端对其进行修补。我认为这是不可能的,您可以对字符串进行两次编码。这可能看起来是两倍的编码字符串,也可能是试图发送编码字符串。@elclanrs,这可能是服务器中的问题,但有没有办法检查我的要求?@mishik我已经更新了我的问题,你能看一看吗?@TapasBose如果你想把
value=%
传递给服务器怎么办?通过反复解码,你指的是一个递归调用?不,我指的是一个
do..while
循环。我会尝试一下
do..while
,不过我在更新-3中写了一个递归。请看一看,我一般不喜欢递归函数,因为它极易陷入无限循环并破坏调用堆栈。另一方面,无限的
do..while
循环将导致浏览器挂起/崩溃,但至少在这样做之前不会消耗所有可用内存。我所做的只是搜索空格()、换行符(\n)、回车符(\r)和标记符(\t)。在我的例子中,我希望通过浏览器地址栏执行JavaScript
javascript:alert('test string')
这对我来说已经足够了。Thx,帮了我很多忙:)如果解码的url文件名中有%20之类的内容,它仍然不起作用。1行版本:
const isEncoded=uri=>uri!==解码组件(uri | |“”)