Как узнать, декодирован/закодирован ли URL?

Я использую метод Javascript decodeURIComponent для декодирования закодированного URL. Теперь у меня проблема: иногда URL-адрес дважды кодируется во время перенаправления между серверами, иногда он кодируется только один раз.

Я хочу проверить, если URL-адрес по-прежнему кодируется после вызова метода decodeURIComponent. Как я могу это сделать? Любой указатель будет очень полезен для меня.

Обновление - 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

Теперь я беру значение callBackUrl в свой js-метод, затем расшифровываю его и запускаю window.open() с этим декодированным URL. параметры одинаковы, и он имеет:

  • adf.tfDoc
  • adf.tfId
  • articleReference
  • previousView
  • fromUCM
  • СтатьяВид статьи
  • Разработчик

Параметры в него. Поэтому я знаю, что нет строки запроса, например value="%..".

Обновление - 3

Я написал следующий метод:

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

    return url;
}

Ответ 1

Повторно декодирование до тех пор, пока вы не найдете никаких знаков %, будет работать более 99% времени. Он будет работать еще лучше, если вы повторно назовете так, чтобы можно было найти совпадение для /%[0-9a-f]{2}/i.

Однако, если бы я (по какой-то странной причине) назвал файл 100%achieved, это вызовет проблему, потому что %ac будет декодироваться до ¬, что приведет к сбою декодирования. К сожалению, нет способа обнаружить этот случай.

В идеале вы должны знать, что что-то закодировано более одного раза, и оптимально вы не должны допускать, чтобы это произошло в первую очередь.

Ответ 2

Существует простой способ кодирования, если кодируется строка 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-адресов, закодированных несколько раз. Надеюсь, это поможет.

Ответ 3

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

вы можете продолжать декодировать до тех пор, пока строка не изменится:

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