Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   C++ (http://www.velocityreviews.com/forums/f39-c.html)
-   -   URL decoding function in C++/C? (http://www.velocityreviews.com/forums/t513502-url-decoding-function-in-c-c.html)

Herman.Schultz@gmail.com 06-10-2007 02:50 PM

URL decoding function in C++/C?
 
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.


linarin 06-10-2007 03:15 PM

Re: URL decoding function in C++/C?
 
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


=?ISO-8859-1?Q?Erik_Wikstr=F6m?= 06-10-2007 03:47 PM

Re: URL decoding function in C++/C?
 
On 2007-06-10 16:50, Herman.Schultz@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

Default User 06-10-2007 06:38 PM

Re: URL decoding function in C++/C?
 
Herman.Schultz@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

BobR 06-10-2007 09:45 PM

Re: URL decoding function in C++/C?
 

<Herman.Schultz@gmail.com> 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



Default User 06-10-2007 10:19 PM

Re: URL decoding function in C++/C?
 
BobR wrote:

>
> <Herman.Schultz@gmail.com> 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

Gianni Mariani 06-11-2007 12:21 AM

Re: URL decoding function in C++/C?
 
Herman.Schultz@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

Robbie Hatley 06-11-2007 06:21 AM

Re: URL decoding function in C++/C?
 

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



James Kanze 06-11-2007 09:41 AM

Re: URL decoding function in C++/C?
 
On Jun 11, 8:21 am, "Robbie Hatley" <bogus.addr...@no.spam> 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:james.kanze@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


jric 03-05-2011 01:20 AM

url encoding snippet
 
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);
}
}
}


All times are GMT. The time now is 03:27 AM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.