https://www.joinc.co.kr/w/Site/Code/C/urlencode
#include <stdio.h>
#include <string.h>
#include <unistd.h>
/*
* urldecode
* 입력된 source를 urldecode해서 dest에 복사한다.
*
*/
int urldecode(unsigned char *source, unsigned char *dest)
{
int num=0, i, hexv, index=0;
int retval=0;
while(*source)
{
if (*source == '%')
{
num = 0;
retval = 0;
for (i = 0; i < 2; i++)
{
*source++;
if (*(source) < ':')
{
num = *(source) - 48;
}
else if (*(source) > '@' && *(source) < '[')
{
num = (*(source) - 'A')+10;
}
else
{
num = (*(source) - 'a')+10;
}
if ((16*(1-i)))
num = (num*16);
retval += num;
}
dest[index] = retval;
index++;
}
else
{
dest[index] = *source;
index++;
}
*source++;
}
return index;
}
int urlencode(unsigned char *source, unsigned char *dest)
{
unsigned char hex[4];
unsigned char *sbuf;
int size = 0;
sbuf = dest;
while(*source)
{
if ((*source > 47 && *source < 57) ||
(*source > 64 && *source < 92) ||
(*source > 96 && *source < 123) ||
*source == '-' || *source == '.' || *source == '_')
{
*sbuf = *source;
}
else
{
sprintf(hex, "%%%02X", *source);
strncat(sbuf, hex,3);
*sbuf++;
*sbuf++;
size += 2;
}
*source++;
*sbuf++;
size++;
}
return size;
}
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#define IS_ALNUM(ch) \
( ch >= 'a' && ch <= 'z' ) || \
( ch >= 'A' && ch <= 'Z' ) || \
( ch >= '0' && ch <= '9' ) || \
( ch >= '-' && ch <= '.' )
char* url_decode( const char* str ){
int i, j = 0, len;
char* tmp;
char hex[3];
len = strlen( str );
hex[2] = 0;
tmp = (char*)malloc( sizeof(char) * (len+1) );
for( i = 0 ; i < len ; i++, j++ ){
if( str[i] != '%' )
tmp[j] = str[i];
else{
if( IS_ALNUM(str[i+1]) && IS_ALNUM(str[i+2]) && i < (len-2) ){
hex[0] = str[i+1];
hex[1] = str[i+2];
tmp[j] = strtol( hex, NULL, 16 );
i += 2;
}
else
tmp[j] = '%';
}
}
tmp[j] = 0;
return tmp;
}
char* url_encode( const char* str ){
int i, j = 0, len;
char* tmp;
len = strlen( str );
tmp = (char*) malloc( (sizeof(char) * 3 * len) +1 );
for( i = 0 ; i < len ; i++ ){
if( IS_ALNUM( str[i] ) )
tmp[j] = str[i];
else{
snprintf( &tmp[j], 4, "%%%02X\n", (unsigned char)str[i] );
j += 2;
}
j++;
}
tmp[j] = 0;
return tmp;
}
------
#define IS_ALNUM(ch) \
(( ch >= 'a' && ch <= 'z' ) || ( ch >= 'A' && ch <= 'Z' ) || ( ch >= '0' && ch <= '9' ) || ( ch >= '-' && ch <= '.' ))
int url_encode(char *str, char *encstr, int len)
{
char buf[2+1];
int i, j;
unsigned char c;
if(str == NULL) {
return 0;
}
for(i = j = 0; i<len; i++) {
c = (unsigned char)str[i];
if (c == ' ') encstr[j++] = '+';
else if ((c >= '0') && (c <= '9')) encstr[j++] = c;
else if ((c >= 'A') && (c <= 'Z')) encstr[j++] = c;
else if ((c >= 'a') && (c <= 'z')) encstr[j++] = c;
else if ((c == '@') || (c == '.')) encstr[j++] = c;
else {
sprintf(buf, "%02X", c);
encstr[j++] = '%';
encstr[j++] = buf[0];
encstr[j++] = buf[1];
}
}
encstr[j] = '\0';
return (strlen(encstr));
}
int url_decode(char *str, char *decstr, int len)
{
int i, j = 0;
char hex[3];
len = strlen( str );
hex[2] = 0;
for( i = 0 ; i < len ; i++, j++ ) {
if( str[i] != '%' ) {
decstr[j] = str[i];
}
else {
if( IS_ALNUM(str[i+1]) && IS_ALNUM(str[i+2]) && i < (len-2) ) {
hex[0] = str[i+1];
hex[1] = str[i+2];
decstr[j] = strtol( hex, NULL, 16 );
i += 2;
}
else {
decstr[j] = '%';
}
}
}
decstr[j] = '\0';
return (strlen(decstr));
}