编码:
std::string urlencode ( char const *url )
{
static unsigned char hexchars[] = "0123456789ABCDEF";
register unsigned char c;
unsigned char *to, *start;
unsigned char const *from, *end;
int len = strlen ( url );
from = (unsigned char *)url;
end = (unsigned char *)url + len;
start = to = (unsigned char *) malloc ( 3 * len + 1 );
while ( from < end )
{
c = *from++;
if ( ' ' == c )
{
*to++ = '+';
#ifndef CHARSET_EBCDIC
}
else if ( ( c < '0' && c != '-' && c != '.' )
|| ( c < 'A' && c > '9' )
|| ( c > 'Z' && c < 'a' && c != '_' )
|| ( c > 'z' ) )
{
to[0] = '%';
to[1] = hexchars[c >> 4];
to[2] = hexchars[c & 15];
to += 3;
#else
}
else if ( !isalnum ( c ) && strchr ( "_-.", c ) == NULL )
{
to[0] = '%';
to[1] = hexchars[os_toascii[c] >> 4];
to[2] = hexchars[os_toascii[c] & 15];
to += 3;
#endif
}
else
{
*to++ = c;
}
}
*to = 0;
return (char*)start;
}
解码:
static char x2c ( const char* what )
{
register char digit;
digit = ( ( what[0] >= 'A' ) ? ( ( what[0] & 0xdf ) - 'A' ) + 10 : ( what[0] - '0' ) );
digit *= 16;
digit += ( what[1] >= 'A' ? ( ( what[1] & 0xdf ) - 'A' ) + 10 : ( what[1] - '0' ) );
return digit;
}
std::string urldecode ( const char* src )
{
char* dest = (char*)malloc ( strlen ( src ) / 2 + 1 );
char* cp = dest;
while ( *src != '\0' )
{
if ( *src == '+' )
{
*dest++ = ' ';
}
else if ( *src == '%' )
{
int ch;
ch = x2c ( src + 1 );
*dest++ = ch;
src += 2;
}
else
{
*dest++ = *src;
}
src++;
}
*dest = '\0';
std::string str = cp;
free ( cp );
return str;
}