C – URL编码

有一种简单的方法在C中进行URL编码吗? 我正在使用libcurl,但我还没有找到方法。 具体来说,我需要做百分之百逃脱。

curl_escape

显然已经被取代了

curl_easy_escape

在基于维基百科的C中,无需分配和免费。 确保输出缓冲区至少为3X输入URL字符串。 通常你只需要编码可能4K,因为URL往往很短,所以只需要在堆栈上执行。

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

像这样使用它

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

我写这个也是为了处理空格字符的查询字符串编码

用法:UrlEncode(“ http://www.example.com/index.html?Hello=World ”,“:/”,缓冲区,buf_size)

url :要编码的url字符串。 可以是字符串文字或字符串数​​组

encode :要编码的以零结尾的字符串。 这是好的,因为您可以在运行时确定要编码的URL的数量

buffer :保存新字符串的缓冲区

size :缓冲区的大小

return :如果缓冲区足够大,则返回新字符串的大小;如果缓冲区不够大,则返回所需的缓冲区大小。 如果要分配所需的确切大小,可以双击此function。

  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编码。 最重要的是 – 它真的很快!