Javascript decodeURI(Component) malformed uri exception
Asked Answered
G

2

49

I entered the following in Chrome's console:

decodeURIComponent('a%AFc');

Instead of resulting to a0xAFc, it caused a URIError exception (malformed uri).

I've heard several excuses why this may be possible, but what I don't understand is why?

The decodeURIComponent() function in particular is supposed to decode data, not verify the URI.

Gopherwood answered 30/1, 2012 at 13:21 Comment(0)
S
57

%AF is not a character on his own but part of Unicode sequence (MACRON - %C2%AF).

%AF wasn't produced by encodeURIComponent but something like escape, so it can be decoded by unescape.

What you probably need is decodeURIComponent('%C2%AF')

Saddleback answered 30/1, 2012 at 13:40 Comment(5)
I made it up after I tried decoding a load of encoded text, failed and noticed it would choke on that particular character. Perhaps unescape is what I need.Gopherwood
@ChristianSciberras encodeURIComponent() is usually a better choice because it works with UTF-8. However, 0xAF on its own is not valid UTF-8-encoded character sequence. This is why your code doesn't work. I hope it's clearer now.Collar
So what if I need to handle ASCII / iso-8859-1 percent-encoded inputs? unescape is deprecated, and there is also no unescapeURIParous
A man like you deserves a special place in heaven. You solved my problem. ThanksRagnar
escape has been Deprecated :(Coricoriaceous
F
14

This may or may not apply to someone else's situation but this is what did it for me so I thought I would share. I upload and download lots of text files to a custom CMS.
the '%' sign in the source code was wreaking havoc for me.

// send to server
content = content.toString().replace(/%/g,'~~pct~~');       // ~~pct~~ <-made up replacement
content = encodeURI(content);

// get back from server / database
content = decodeURI(content);
content = content.toString().replace(/~~pct~~/g,'%');    // globally restore '%'
Farman answered 29/3, 2019 at 14:50 Comment(3)
Really gr8 hackNicotine
Instead of encoding % to ~~pct~~, encode % to %25. Then there is nothing to do on the decode side and decodeURI will convert %25 to %.Winnah
You can only decode %hex character pairs using try...catch content.replace(/(%[0-9a-f]{2})+/gi, a => {try{return decodeURIComponent(a)}catch(e){return a}})Recreate

© 2022 - 2024 — McMap. All rights reserved.