>Здравствуйте, уважаемое сообщество!
>
>Возникла необходимость преобразования строки в строку URL, т.е. к примеру прреобразовать '
>' в и т.д., т.е. по сути функция перла rawurlencode.
>В связи с чем возникает вопрос - есть ли готовые варианты
>реализации такой функции на С++ чтобы не сооружать самому? Желательно именно
>реализация, т.е. код а не целые библиотеки которые надо использовать для
>этого (к примеру curl).
>
>Большое спасибо! #define HEX_ESCAPE '%'
#define isAcceptable(a) (a >= 32 && a < 128 && acceptable[a - 32])
unsigned char acceptable[96] =
{/* 0x0 0x1 0x2 0x3 0x4 0x5 0x6 0x7 0x8 0x9 0xA 0xB 0xC 0xD 0xE 0xF */
0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xF,0xE,0x0,0xF,0xF,0x0, /* 2x !"#$%&'()*+,-./ */
0xF,0xF,0xF,0xF,0xF,0xF,0xF,0xF,0xF,0xF,0x0,0x0,0x0,0x0,0x0,0x0, /* 3x 0123456789:;<=>? */
0xF,0xF,0xF,0xF,0xF,0xF,0xF,0xF,0xF,0xF,0xF,0xF,0xF,0xF,0xF,0xF, /* 4x @ABCDEFGHIJKLMNO */
0xF,0xF,0xF,0xF,0xF,0xF,0xF,0xF,0xF,0xF,0xF,0x0,0x0,0x0,0x0,0xF, /* 5X PQRSTUVWXYZ[\]^_ */
0x0,0xF,0xF,0xF,0xF,0xF,0xF,0xF,0xF,0xF,0xF,0xF,0xF,0xF,0xF,0xF, /* 6x `abcdefghijklmno */
0xF,0xF,0xF,0xF,0xF,0xF,0xF,0xF,0xF,0xF,0xF,0x0,0x0,0x0,0x0,0x0 /* 7X pqrstuvwxyz{\}~DEL */
};
const char *hex = "0123456789ABCDEF";
char *escape(const char *in) {
char *out;
const char *p;
char *q;
int unacceptable = 0;
int len = 0;
if (!in) return 0;
for (p = in; *p; p++)
if (!isAcceptable((unsigned char)*p)) {
unacceptable++;
len += 3;
} else len++;
out = malloc(len + 1);
for (q = out, p = in; *p; p++) {
unsigned char a = *p;
if (!isAcceptable(a)) {
*q++ = HEX_ESCAPE;/* Means hex commming */
*q++ = hex[a >> 4];
*q++ = hex[a & 15];
} else *q++ = *p;
}
*q = 0;
return out;
}
в нагрузку:
char *unescape(const char *in) {
char *out, *p, *o;
int l = strlen(in);
o = out = malloc(l + 1);
memset(out, 0, l + 1);
for (p = (char *)in; *p; ) {
if (*p == '%') {
unsigned char a;
p++;
if (!*p) { p--; *o = *p; break; }
if (!(*p >= '2' && *p <= '7')) { p--; *o++ = *p++; continue; }
a = (*p - 48) << 4;
p++;
if (!*p) { free(out); return 0; }
if (*p >= 'A' && *p <= 'F')
a += *p - 'A' + 10;
else if (*p >= 'a' && *p <= 'f')
a += *p - 'a' + 10;
else if (*p >= '0' && *p <= '9')
a += *p - '0';
else {
free(out);
return 0;
}
*o++ = a;
p++;
} else
*o++ = *p++;
}
return out;
}