C – encodage d’URL

Existe-t-il un moyen simple de coder les URL en C? J’utilise libcurl mais je n’ai pas trouvé de méthode. Plus précisément, je dois faire des échappées en pourcentage.

curl_escape

qui a apparemment été remplacé par

curl_easy_escape

En C basé sur wikipedia, sans avoir à atsortingbuer et gratuit. Assurez-vous que la mémoire tampon de sortie contient au moins 3 chaînes d’URL d’entrée. Habituellement, vous n’avez besoin que d’encoder jusqu’à 4K car les URL ont tendance à être courtes, faites-le simplement sur la stack.

 char rfc3986[256] = {0}; char html5[256] = {0}; void url_encoder_rfc_tables_init(){ int i; for (i = 0; i < 256; i++){ rfc3986[i] = isalnum( i) || i == '~' || i == '-' || i == '.' || i == '_' ? i : 0; html5[i] = isalnum( i) || i == '*' || i == '-' || i == '.' || i == '_' ? i : (i == ' ') ? '+' : 0; } } char *url_encode( char *table, unsigned char *s, char *enc){ for (; *s; s++){ if (table[*s]) sprintf( enc, "%c", table[*s]); else sprintf( enc, "%%%02X", *s); while (*++enc); } return( enc); } 

Utilisez-le comme ça

 url_encoder_rfc_tables_init(); url_encode( html5, url, url_encoded); 

J’ai écrit ceci pour prendre également en charge l’encodage de chaîne de requête du caractère d’espace

Utilisation: UrlEncode (” http://www.example.com/index.html?Hello=World “, “: /”, tampon, buf_size)

url : la chaîne d’URL à encoder. Peut être un littéral de chaîne ou un tableau de chaîne

encode : Une chaîne de caractères à zéro terminée à encoder. C’est une bonne raison que vous puissiez, au moment de l’exécution, déterminer la quantité d’URL à encoder

tampon : un tampon pour contenir la nouvelle chaîne

size : La taille du tampon

return : Retourne la taille de la nouvelle chaîne si le tampon est suffisamment grand OU renvoie la taille requirejse du tampon si le tampon n’est pas assez grand. Vous pouvez appuyer deux fois sur cette fonction si vous souhaitez atsortingbuer la taille exacte requirejse.

  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 ssortingng //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 ssortingng (?), move to query ssortingng 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; } 

Cette fonction prend en charge la plupart (sinon la totalité) des encodages d’URL dont vous auriez besoin. Le meilleur de tous – c’est vraiment rapide!