# Unencoding encoded URLs in a function

Is there a built-in function for decoding encoded URLs in Mathematica? I would like to convert an encoded URL, for example https%3A%2F%2Fwww.google.co.uk%2Fimages%2Fsrpr%2Flogo4w.png into https://www.google.co.uk/images/srpr/logo4w.png as attempting to directly access the encoded URL with Import[] fails.

-
StackOverflow question: stackoverflow.com/q/3160924/618728 –  Mr.Wizard Apr 4 '13 at 13:16

Works nicely:

PercentDecode[s_String] := StringReplace[s, RegularExpression["%([[:xdigit:]]{2})"] :>
FromCharacterCode[FromDigits["$1", 16]]] PercentEncode[s_String] := StringReplace[s, {" " -> "+", RegularExpression["[^\\w/\\?=:._~]"] :> StringJoin["%", ToUpperCase[IntegerString[First[ToCharacterCode["$0"]], 16]]]}]


Test:

PercentDecode["http://www.test.com/~a_b?i=Cos%5B2%5D"]
"http://www.test.com/~a_b?i=Cos[2]"

PercentEncode["http://www.test.com/~a_b?i=Cos[2]"]
"http://www.test.com/~a_b?i=Cos%5B2%5D"

-
Thanks for the function! Works nicely. –  March Ho Apr 4 '13 at 12:39
I'm not an expert for this, and the relevant standards have changed once in a while. But concerning PercentEncode maybe is worth noting that as far as I understand the decoding should always give unambiguous results while the encoding is somewhat arbitrary: it has not always been exactly specified which characters have to be encoded and which not, the latest RFCs about this seem to be more strict. So encoding with different functions/services might give different results, but I don't think that means there is an error as long as the decoding results in the same string. –  Albert Retey Apr 4 '13 at 12:51
@Albert: True, for the encoding I went with the characters that are frequently encoded by browsers. It should not be too hard to modify PercentEncode[], of course. –  Ｊ. Ｍ. Apr 4 '13 at 12:55
@J.M.: to my understanding encoding is necessary for exactly those characters that are not "unreserved", everything else must be encoded if they are not to be interpreted with their "reserved" special meaning. So whether or not a character needs to be encoded depends on what they should be interpreted, if e.g. you want to send an url as an argument to a cgi script you would (unlike your PercentEncode does) need to encode "/". The uncertainty seems to be with all those characters that are not explicitly "reserved" or "unreserved"... –  Albert Retey Apr 4 '13 at 14:05

There might be undocumented internal functions burried somewhere to do this, but it is relatively straightforward to get a result via JLink:

Needs["JLink"];
InstallJava[];
javanetURLDecoderdecode[url]


see the Java documentation for more information about the java.net package and the java.net.URLDecoder class. The class java.net.URLEncoder might also be of interest...

With the information in e.g. wikipedia about "percent encoding" and the links to the relevant RFCs it is actually not difficult to build something based on StringReplace -- as J.M.'s answer shows in a very elegant way.

-
ExternalServiceDecodeString["https%3A%2F%2Fwww.google.co.uk%2Fimages%2Fsrpr%2Flogo4w.png"]

ExternalServiceEncodeString does URL-encoding, if you want to go in the other direction.