8
votes

C - Encodage de l'URL

Y a-t-il un moyen simple d'encoder l'URL en C? J'utilise libcurl mais je n'ai pas trouvé de méthode. Plus précisément, j'ai besoin de faire des escapades pour cent.


0 commentaires

3 Réponses :


7
votes

curl_escape

qui a apparemment été remplacé par

curl_easy_escape


1 commentaires

Faites attention! Les fonctions ci-dessus ne produisent pas de résultats compatibles avec (par exemple) PHP UrlenCode Funtion



14
votes

en C en C basé sur Wikipedia, sans avoir à alloc ni libre. Assurez-vous que la mémoire tampon de sortie est au moins 3x chaîne d'URL d'entrée. Habituellement, il vous suffit d'encoder jusqu'à peut-être 4k car les URL ont tendance à être courtes, alors faites-la simplement sur la pile.

url_encoder_rfc_tables_init();

url_encode( html5, url, url_encoded);


2 commentaires

Cette ligne "Sprintf (ENC,"% C ", Tableau [* S])" peut être simplifié à "* ENC = * s" - vous évitez d'appeler la fonction de formatage coûteuse.


Vous voulez dire * ENC = table [* s]?



0
votes

J'ai écrit ceci pour vous occuper également du codage de la chaîne de requête du caractère spatial

Utilisation: UrlenCode (" http://www.example.com/index.html?hello=world ",": / ", tampon, buf_size) p>

URL : la chaîne d'URL à coder. Peut être une grève littéral ou de chaîne p>

Encode forte>: une chaîne de caractères à terminaison zéro pour coder. C'est une bonne cause que vous puissiez à l'exécution, déterminez la quantité de l'URL à coder p>

Buffer fort>: un tampon pour maintenir la nouvelle chaîne p>

Taille strong>: la taille de la mémoire tampon p>

retour fort>: retourne la taille de la nouvelle chaîne si la mémoire tampon est suffisamment grande ou renvoie la taille de la mémoire tampon requise si le tampon n'est pas grand assez. Vous pouvez appuyer sur cette fonction si vous souhaitez attribuer la taille exacte nécessaire. P>

    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;
    }


0 commentaires