Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > URL decoding function in C++/C?

Reply
Thread Tools

URL decoding function in C++/C?

 
 
Herman.Schultz@gmail.com
Guest
Posts: n/a
 
      06-10-2007
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.

 
Reply With Quote
 
 
 
 
linarin
Guest
Posts: n/a
 
      06-10-2007
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

 
Reply With Quote
 
 
 
 
=?ISO-8859-1?Q?Erik_Wikstr=F6m?=
Guest
Posts: n/a
 
      06-10-2007
On 2007-06-10 16:50, http://www.velocityreviews.com/forums/(E-Mail Removed) 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 Wikstrm
 
Reply With Quote
 
Default User
Guest
Posts: n/a
 
      06-10-2007
(E-Mail Removed) 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
 
Reply With Quote
 
BobR
Guest
Posts: n/a
 
      06-10-2007

<(E-Mail Removed)> wrote 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


 
Reply With Quote
 
Default User
Guest
Posts: n/a
 
      06-10-2007
BobR wrote:

>
> <(E-Mail Removed)> wrote 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
 
Reply With Quote
 
Gianni Mariani
Guest
Posts: n/a
 
      06-11-2007
(E-Mail Removed) 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
 
Reply With Quote
 
Robbie Hatley
Guest
Posts: n/a
 
      06-11-2007

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 "Espaa") // 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


 
Reply With Quote
 
James Kanze
Guest
Posts: n/a
 
      06-11-2007
On Jun 11, 8:21 am, "Robbie Hatley" <(E-Mail Removed)> wrote:
> 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:(E-Mail Removed)
Conseils en informatique oriente objet/
Beratung in objektorientierter Datenverarbeitung
9 place Smard, 78210 St.-Cyr-l'cole, France, +33 (0)1 30 23 00 34

 
Reply With Quote
 
jric jric is offline
Junior Member
Join Date: Mar 2011
Posts: 1
 
      03-05-2011
While I generally agree with the last poster who says that you should try to use a tested library, I was unsuccessful in finding a lightweight library (curl was too heavy for me). Plus, I'm running in a special multi-threaded environment where I need to have very good accounting of my memory management. So, I wrote this snippet to do url-encoding, adapted from other code I found on the web (http://www.gidforums.com/t-2615.html). Hope it helps the next guy find what he's looking for faster. Note that it's conservative and encodes everything that's not a number or a letter, but urldecoders will generally work with that.

template <class type> //template usage to allow multiple types of parameters
void dec_to_hex(type _num, char *hdigits)
{
const char *hlookup = "0123456789ABCDEF";

if(_num<0) _num *= -1;

char mask = 0x000f;

hdigits[1] = hlookup[mask & _num];
hdigits[0] = hlookup[mask & (_num >> 4)];

return;
}

void urlencode(std::string &str) {
size_t pos = 0;
std::string replacement;
for ( ; pos < str.length(); pos++) {
if (!isalnum(str[pos])) {
char dec[2];
dec_to_hex(str[pos], dec);
std::string replacement = "%" + std::string(dec, 2);
str.replace(pos, 1, replacement);
}
}
}
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
URL decoding/encoding problem flyingco C Programming 4 11-27-2006 08:50 AM
URL Character Decoding Kirk McDonald Python 4 01-30-2006 04:11 AM
Query parameters, Javascript and URL decoding issue R L Vandaveer ASP .Net 0 12-22-2005 04:48 PM
URL Decoding Issue --- HELP! Ron Clabo ASP .Net 3 04-28-2005 07:36 PM
Decoding url HP ASP .Net 2 01-12-2005 08:16 PM



Advertisments