Как узнать, декодирован/закодирован ли 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);