The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Индекс форумов
Составление сообщения

Исходное сообщение
"аналог 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;
}

 

Ваше сообщение
Имя*:
EMail:
Для отправки новых сообщений в текущей нити на email укажите знак ! перед адресом, например, !user@host.ru (!! - не показывать email).
Более тонкая настройка отправки ответов производится в профиле зарегистрированного участника форума.
Заголовок*:
Сообщение*:
 
При общении не допускается: неуважительное отношение к собеседнику, хамство, унизительное обращение, ненормативная лексика, переход на личности, агрессивное поведение, обесценивание собеседника, провоцирование флейма голословными и заведомо ложными заявлениями. Не отвечайте на сообщения, явно нарушающие правила - удаляются не только сами нарушения, но и все ответы на них. Лог модерирования.



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру