By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
445,851 Members | 2,097 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 445,851 IT Pros & Developers. It's quick & easy.

URL decoding function in C++/C?

P: n/a
Hi,

Can you please tell me if there is a library function in C++/C to do
URL decoding?
i.e. change from:
http%3A%2F%2F
to:
http://

Thank you.

Jun 10 '07 #1
Share this Question
Share on Google+
8 Replies


P: n/a
what is C++ language are you using. because standard C++ does not
define this URL Decode function.

I suggest you that look into the java source and build the class for
URL Decoding yourself.

the Visual C++ has provide A function to decoding URL, please
reference here: http://www.codeproject.com/internet/CppHttpWebForm.asp

Jun 10 '07 #2

P: n/a
On 2007-06-10 16:50, He************@gmail.com wrote:
Hi,

Can you please tell me if there is a library function in C++/C to do
URL decoding?
i.e. change from:
http%3A%2F%2F
to:
http://
There's non in standard C++, if you are using some framework/library
there might be one in that. Else I think you can do something similar
yourself quite easy (this is based on my limited understanding of how
this URL encoding works).

All you have to do is copy the URL until you encounter '%', then you
read in the next two characters, convert them to an int, create a char
variable, assign the number to it, add the char to the copy. Then
proceed like this until you reach the end of the URL.

This however requires that your platform uses ASCII as native chars (or
whatever it is called).

--
Erik Wikström
Jun 10 '07 #3

P: n/a
He************@gmail.com wrote:
Hi,

Can you please tell me if there is a library function in C++/C to do
URL decoding?
i.e. change from:
http%3A%2F%2F
to:
http://
Nothing standard. Google around, there are tons of snippets for that
sort of thing.

Brian
Jun 10 '07 #4

P: n/a

<He************@gmail.comwrote in message...
Hi,
Can you please tell me if there is a library function in C++/C to do
URL decoding?
i.e. change from:
http%3A%2F%2F
to:
http://

Thank you.
Not hard to write your own.

{
std::cout<<"-------"<<std::endl;
std::string Test( "http%3A%2F%2F" );
std::cout<<Test<<std::endl;
std::string Find1( "%3A" );
std::string Rep1( ":" );
std::string Find2( "%2F" );
std::string Rep2( "/" );
Test.replace( Test.find( Find1 ), Find1.size(), Rep1);
std::size_t Pos;
while( ( Pos = Test.find( Find2 ) ) != Test.npos ){
Test.replace( Pos, Find2.size(), Rep2 );
}
std::cout<<Test<<std::endl;
std::cout<<"-------"<<std::endl;
}
Maybe put the from/to pairs in a std::map, and use that in a loop.

--
Bob R
POVrookie
Jun 10 '07 #5

P: n/a
BobR wrote:
>
<He************@gmail.comwrote in message...
Hi,
Can you please tell me if there is a library function in C++/C to do
URL decoding?
i.e. change from:
http%3A%2F%2F
to:
http://

Thank you.

Not hard to write your own.

{
std::cout<<"-------"<<std::endl;
std::string Test( "http%3A%2F%2F" );
std::cout<<Test<<std::endl;
std::string Find1( "%3A" );
std::string Rep1( ":" );
std::string Find2( "%2F" );
std::string Rep2( "/" );
Yeah, but there are lot of characters to decode. You're better off not
reinventing the wheel unless there's a particular reason to do so, like
it's a instructional program.

Many decode programs are out there, in most any language you like.


Brian
Jun 10 '07 #6

P: n/a
He************@gmail.com wrote:
Hi,

Can you please tell me if there is a library function in C++/C to do
URL decoding?
i.e. change from:
http%3A%2F%2F
to:
http://
Nothing standard comes to mind. There is a url parser in austria c++ -
it contains a decoder as well.

http://austria.sourceforge.net/dox/h...8h-source.html
Jun 11 '07 #7

P: n/a

Herman Schultz wrote:
Hi,
Hello!
Can you please tell me if there is a library function
in C++/C to do URL decoding?
i.e. change from:
http%3A%2F%2F
to:
http://
There is no *standard* library facility to do that.

There's almost certainly libraries out there that have
that facility, though. Google for "C++ URL library" or
similar searches.

However, it may be simpler to just to write your own.

Here's a big hint: Unix file names may only contain certain
characters, not others; so Unix tends to turn unacceptable
characters into 3-character triglyphs consisting of "%"
followed by the two-digit ASCII value of the character,
in hexidecimal. (Or, if the numbers are greater than %7E,
they're probably ISO-8859-1 instead of ASCII.)

Examples:

* = %2A (as in "grep 'dog' *") // ASCII
/ = %2F (as in "user/bin") // ASCII
§ = %A7 (as in "see §38.7.13") // assuming ISO-8859-1
ñ = %F1 (as in "España") // assuming ISO-8859-1

(Google "ASCII" and "ISO-8859-1" for more on these encodings.)

So just replace each %HH with the character who's encoding
is "HH". Eg: "%64%6F%67" becomes "dog".

Grab each "%XY" using std::string.find() and std::string.substr().
Feed each "%XY" substring into a function that returns the
character with that encoding. Then replace the "%XY" in the string
with the character Z which you just generated, by using
std::string.replace().

Here's a program I just wrote, for the fun of it, which solves
your problem (tested, working code). (CAVEAT: This assumes that
any '%' character will be followed by a valid two-digit hexidecimal
number. If not, it will blow up. You'll have to add your own
error-checking.)

// dehex.cpp

#include <iostream>
#include <string>
#include <sstream>

char CharFromHex (std::string a)
{
std::istringstream Blat (a);
int Z;
Blat >std::hex >Z;

/*
int X = int (a[1]); // 16^1 place value
if (X >= 97) {X -= 97;} // capital letter?
else if (X >= 65) {X -= 65;} // small letter?
else {X -= 48;} // numeral?
int Y = int (a[2]); // 16^0 place value
if (Y >= 97) {Y -= 97;} // capital letter?
else if (Y >= 65) {Y -= 65;} // small letter?
else {Y -= 48;} // numeral?
int Z = 16 * X + Y; // generate numerical value of character
*/

return char (Z); // cast to char and return
}

int main (int Beren, char * Luthien[])
{
std::string Text (Luthien[1]);
std::string::size_type Pos;
std::string Hex;
while (std::string::npos != (Pos = Text.find('%')))
{
Hex = Text.substr(Pos + 1, 2);
Text.replace(Pos, 3, 1, CharFromHex(Hex));
}
std::cout << Text << std::endl;
return 0;
}
Thank you.
You're welcome.

--
Cheers,
Robbie Hatley
lonewolf aatt well dott com
triple-dubya dott tustinfreezone dott org
Jun 11 '07 #8

P: n/a
On Jun 11, 8:21 am, "Robbie Hatley" <bogus.addr...@no.spamwrote:
Herman Schultz wrote:
Can you please tell me if there is a library function
in C++/C to do URL decoding?
i.e. change from:
http%3A%2F%2F
to:
http://
There is no *standard* library facility to do that.
There's almost certainly libraries out there that have
that facility, though. Google for "C++ URL library" or
similar searches.
However, it may be simpler to just to write your own.
You're kidding, of course.
Here's a big hint: Unix file names may only contain certain
characters, not others;
It has nothing to do with Unix; the only characters which cannot
occur in a Unix filename are '/' and '\0'.

[...]
Grab each "%XY" using std::string.find() and std::string.substr().
Feed each "%XY" substring into a function that returns the
character with that encoding. Then replace the "%XY" in the string
with the character Z which you just generated, by using
std::string.replace().
And this is simpler than just calling a single function in a
third party library.
Here's a program I just wrote, for the fun of it, which solves
your problem (tested, working code). (CAVEAT: This assumes that
any '%' character will be followed by a valid two-digit hexidecimal
number. If not, it will blow up. You'll have to add your own
error-checking.)
Which will likely increase the size of the code by two or three.

--
James Kanze (GABI Software) email:ja*********@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

Jun 11 '07 #9

This discussion thread is closed

Replies have been disabled for this discussion.