URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 6651
[ Назад ]

Исходное сообщение
"аналог rawurlencode"

Отправлено dimonna , 02-Авг-07 09:06 
Здравствуйте, уважаемое сообщество!

Возникла необходимость преобразования строки в строку URL, т.е. к примеру прреобразовать ' ' в %20 и т.д., т.е. по сути функция перла rawurlencode. В связи с чем возникает вопрос - есть ли готовые варианты реализации такой функции на С++ чтобы не сооружать самому? Желательно именно реализация, т.е. код а не целые библиотеки которые надо использовать для этого (к примеру curl).

Большое спасибо!


Содержание

Сообщения в этом обсуждении
"аналог rawurlencode"
Отправлено NuINu , 02-Авг-07 10:08 
>Здравствуйте, уважаемое сообщество!
>
>Возникла необходимость преобразования строки в строку URL, т.е. к примеру прреобразовать '
>' в %20 и т.д., т.е. по сути функция перла rawurlencode.
>В связи с чем возникает вопрос - есть ли готовые варианты
>реализации такой функции на С++ чтобы не сооружать самому? Желательно именно
>реализация, т.е. код а не целые библиотеки которые надо использовать для
>этого (к примеру curl).
>
>Большое спасибо!

Лично я задавшись бы таким вопросом, взял бы и покопался в исходниках Апача, в конце концов именно он эту фигню и разгребает.


"аналог rawurlencode"
Отправлено dimonna , 02-Авг-07 12:38 
>[оверквотинг удален]
>>' в %20 и т.д., т.е. по сути функция перла rawurlencode.
>>В связи с чем возникает вопрос - есть ли готовые варианты
>>реализации такой функции на С++ чтобы не сооружать самому? Желательно именно
>>реализация, т.е. код а не целые библиотеки которые надо использовать для
>>этого (к примеру curl).
>>
>>Большое спасибо!
>
>Лично я задавшись бы таким вопросом, взял бы и покопался в исходниках
>Апача, в конце концов именно он эту фигню и разгребает.

Ну может быть есть готовые решения?


"аналог rawurlencode"
Отправлено anonymous , 02-Авг-07 21:49 
>Ну может быть есть готовые решения?

http://www.koders.com/default.aspx?s=rawurlencode&btn=Search...*


"аналог rawurlencode"
Отправлено FarID , 07-Авг-07 11:37 
>Здравствуйте, уважаемое сообщество!
>
>Возникла необходимость преобразования строки в строку 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;
}