C - кодировка URL - PullRequest
       24

C - кодировка URL

7 голосов
/ 30 апреля 2011

Есть ли простой способ сделать URL-кодирование в C? Я использую libcurl, но я не нашел метод. В частности, мне нужно сделать процентные побеги.

Ответы [ 3 ]

10 голосов
/ 01 февраля 2014

В C на основе википедии, без необходимости выделять и бесплатно.Убедитесь, что в буфере вывода не менее 3Х входной строки URL.Обычно вам нужно всего лишь кодировать до 4K, поскольку URL-адреса, как правило, короткие, поэтому просто сделайте это в стеке.

7 голосов
/ 30 апреля 2011

curl_escape

, который, очевидно, был заменен

curl_easy_escape

0 голосов
/ 15 июня 2017

Я написал это, чтобы также позаботиться о кодировании строки запроса пробела

Использование: UrlEncode ("http://www.example.com/index.html?Hello=World",": / ", буфер, buf_size)

url : строка URL для кодирования. Может быть строковым литералом или строковым массивом

encode : строка символов с нулем в конце для кодирования. Это хорошо, потому что вы можете во время выполнения определить, какая часть URL кодируется

буфер : буфер для хранения новой строки

размер : размер буфера

return : Возвращает размер новой строки, если буфер достаточно большой, ИЛИ возвращает требуемый размер буфера, если буфер недостаточно велик. Вы можете дважды нажать эту функцию, если хотите выделить точный необходимый размер.

    int UrlEncode(char* url, char* encode,  char* buffer, unsigned int size)
    {
        char chars[127] = {0};
        unsigned int length = 0;

        if(!url || !encode || !buffer) return 0;

//Create an array to hold ascii chars, loop through encode string
//and assign to place in array. I used this construct instead of a large if statement for speed.
        while(*encode) chars[*encode++] = *encode;

//Loop through url, if we find an encode char, replace with % and add hex
//as ascii chars. Move buffer up by 2 and track the length needed.
//If we reach the query string (?), move to query string encoding
    URLENCODE_BASE_URL:
        while(size && (*buffer = *url)) {
            if(*url == '?') goto URLENCODE_QUERY_STRING;
            if(chars[*url] && size > 2) {
                *buffer++ = '%';
                itoa(*url, buffer, 16);
                buffer++; size-=2; length+=2;
            }
            url++, buffer++, size--; length++;  
        }
        goto URLENCODE_RETURN;

//Same as above but on spaces (' '), replace with plus ('+') and convert
//to hex ascii. I moved this out into a separate loop for speed.
    URLENCODE_QUERY_STRING:
        while(size && (*buffer = *url)) {
            if(chars[*url] && size > 2) {
                *buffer++ = '%';
                if(*url == ' ') itoa('+', buffer, 16);
                else itoa(*url, buffer, 16);
                buffer++; size-=2; length+=2;
            }
            url++, buffer++, size--; length++;
        }

//Terminate the end of the buffer, and if the buffer wasn't large enough
//calc the rest of the url length and return
    URLENCODE_RETURN:
        *buffer = '\0';
        if(*url)
        while(*url) { if(chars[*url]) length+=2; url++; length++; }
        return length;
    }

Эта функция в значительной степени обрабатывает большинство (если не все) кодировки URL, которые вам понадобятся. Лучше всего - это действительно быстро!

...