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. P>
3 Réponses :
Faites attention! Les fonctions ci-dessus ne produisent pas de résultats compatibles avec (par exemple) PHP UrlenCode Funtion
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);
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]?
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>
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> 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;
}