How to know if a URL is decoded/encoded?

33,282

Solution 1

Repeatedly decoding until you find no % signs will work over 99% of the time. It'll work even better if you repeatedly call so long as a match for /%[0-9a-f]{2}/i can be found.

However, if I were (for some bizarre reason) to name a file 100%achieved, that would cause a problem because %ac would be decoded to ¬, causing the decode to fail. Unfortunately there's no way to detect this case.

Ideally you should know if something is encoded more than once, and optimally you shouldn't let it happen in the first place.

Solution 2

There is a simple way to konw if a URL string is encoded.

Take the initial string and compare it with the result of decoding it. If the result is the same, the string is not encoded; if the result is different then it is encoded.

I had this issue with my urls and I used this functions:

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

  return uri !== decodeURIComponent(uri);
}

So now I can use isEncoded as the discriminant in a while loop (or with recursion) to know if I need to keep calling decodeURIComponent on the string:

function fullyDecodeURI(uri){

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

  return uri;
}

This solved the problem for me of decoding urls encoded multiple times. Hope this helps.

Solution 3

you can keep decode until the string did not change:

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

Solution 4

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

Test :

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)
Share:
33,282
Tapas Bose
Author by

Tapas Bose

Java developer.

Updated on December 15, 2020

Comments

  • Tapas Bose
    Tapas Bose over 3 years

    I am using Javascript method decodeURIComponent to decode an encoded URL. Now I am having an issue, that sometimes the URL is get encoded twice during redirection between servers, sometimes it is encoded only once.

    I want to check that if the URL is still encoded after calling the method decodeURIComponent. How can I do that? Any pointer would be very helpful to me.

    Update - 1

    If I recursively call a method and check that if the given URL still contains "%", if it contains "%" then decode it and call the method again; and if not return it to the caller, will that work?

    Update - 2

    For my case I have:

    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
    

    Now I am taking the value of the callBackUrl in my js method, then decoding it and firing window.open() with that decoded URL. the parameters are same and it has:

    • adf.tfDoc
    • adf.tfId
    • articleReference
    • previousView
    • fromUCM
    • articleType
    • developer

    Parameters into it. So I know there is no query string like value="%..".

    Update - 3

    I have written the following method:

    var decodeURLRecursively = function(url) {
        if(url.indexOf('%') != -1) {
            return decodeURLRecursively(decodeURIComponent(url));
        }
    
        return url;
    }
    
  • Tapas Bose
    Tapas Bose almost 11 years
    By repeatedly decoding you mean a recursive call?
  • Niet the Dark Absol
    Niet the Dark Absol almost 11 years
    No, I mean a do..while loop.
  • Tapas Bose
    Tapas Bose almost 11 years
    I will give a try to the do..while, however I have written a recursion in my Update - 3. Please take a look.
  • Niet the Dark Absol
    Niet the Dark Absol almost 11 years
    I don't like recursive functions in general, because it is extremely easy to get stuck in an infinite loop and blow up the call stack. On the other hand, an infinite do..while loop will cause the browser to hang/crash, but at least it won't consume all the available memory before doing so.
  • Yoraco Gonzales
    Yoraco Gonzales almost 9 years
    What I do is simply to search for space ( ),line-breaks (\n), carriage-return (\r) and tag (\t) characters. In my case I want to execute a JavaScript via the browsers address bar. javascript:alert('test string') so it is sufficient for me.
  • Steffan
    Steffan almost 7 years
    Thx, helped me alot :)
  • Chet
    Chet almost 6 years
    Still doesn't work if your decoded url has a %20 in the filename or something.
  • Daniel Tonon
    Daniel Tonon almost 4 years
    1 line version: const isEncoded = uri => uri !== decodeURIComponent(uri || '')