C/C++ URL编码,解码(提取自PHP)

来源:互联网 发布:阿里云国际版价格 编辑:程序博客网 时间:2024/04/28 16:19

URL解码函数:

Cpp代码  收藏代码
  1. /* {{{ php_htoi 
  2.  */  
  3. static int php_htoi(char *s)  
  4. {  
  5.     int value;  
  6.     int c;  
  7.   
  8.     c = ((unsigned char *)s)[0];  
  9.     if (isupper(c))  
  10.         c = tolower(c);  
  11.     value = (c >= '0' && c <= '9' ? c - '0' : c - 'a' + 10) * 16;  
  12.   
  13.     c = ((unsigned char *)s)[1];  
  14.     if (isupper(c))  
  15.         c = tolower(c);  
  16.     value += c >= '0' && c <= '9' ? c - '0' : c - 'a' + 10;  
  17.   
  18.     return (value);  
  19. }  
  20. /* }}} */  
  21.   
  22. /* {{{ URL解码,提取自PHP 5.2.17 
  23.    用法:string urldecode(string str_source) 
  24.    时间:2012-8-14 By Dewei 
  25. */  
  26. string urldecode(string &str_source)  
  27. {  
  28.     char const *in_str = str_source.c_str();  
  29.     int in_str_len = strlen(in_str);  
  30.     int out_str_len = 0;  
  31.     string out_str;  
  32.     char *str;  
  33.   
  34.     str = _strdup(in_str);  
  35.     char *dest = str;  
  36.     char *data = str;  
  37.   
  38.     while (in_str_len--) {  
  39.         if (*data == '+') {  
  40.             *dest = ' ';  
  41.         }  
  42.         else if (*data == '%' && in_str_len >= 2 && isxdigit((int) *(data + 1))   
  43.             && isxdigit((int) *(data + 2))) {  
  44.                 *dest = (char) php_htoi(data + 1);  
  45.                 data += 2;  
  46.                 in_str_len -= 2;  
  47.         } else {  
  48.             *dest = *data;  
  49.         }  
  50.         data++;  
  51.         dest++;  
  52.     }  
  53.     *dest = '\0';  
  54.     out_str_len =  dest - str;  
  55.     out_str = str;  
  56.     free(str);  
  57.     return out_str;  
  58. }  
  59. /* }}} */  
 

 

URL编码函数:

Cpp代码  收藏代码
  1. /* {{{ URL编码,提取自PHP  
  2.    用法:string urlencode(string str_source) 
  3.    说明:仅不编码 -_. 其余全部编码,空格会被编码为 + 
  4.    时间:2012-8-13 By Dewei 
  5. */  
  6. string urlencode(string &str_source)  
  7. {  
  8.     char const *in_str = str_source.c_str();  
  9.     int in_str_len = strlen(in_str);  
  10.     int out_str_len = 0;  
  11.     string out_str;  
  12.     register unsigned char c;  
  13.     unsigned char *to, *start;  
  14.     unsigned char const *from, *end;  
  15.     unsigned char hexchars[] = "0123456789ABCDEF";  
  16.   
  17.     from = (unsigned char *)in_str;  
  18.     end = (unsigned char *)in_str + in_str_len;  
  19.     start = to = (unsigned char *) malloc(3*in_str_len+1);  
  20.   
  21.     while (from < end) {  
  22.         c = *from++;  
  23.   
  24.         if (c == ' ') {  
  25.             *to++ = '+';  
  26.         } else if ((c < '0' && c != '-' && c != '.') ||  
  27.             (c < 'A' && c > '9') ||  
  28.             (c > 'Z' && c < 'a' && c != '_') ||  
  29.             (c > 'z')) {   
  30.                 to[0] = '%';  
  31.                 to[1] = hexchars[c >> 4];  
  32.                 to[2] = hexchars[c & 15];  
  33.                 to += 3;  
  34.         } else {  
  35.             *to++ = c;  
  36.         }  
  37.     }  
  38.     *to = 0;  
  39.   
  40.     out_str_len = to - start;  
  41.     out_str = (char *) start;  
  42.     free(start);  
  43.     return out_str;  
  44. }  
  45. /* }}} */  
  46.   
  47. /* {{{ URL编码CString版,提取自PHP 5.2.17 
  48.    用法:CString urlencode(CString str_source) 
  49.    说明:仅不编码 -_. 其余全部编码,空格会被编码为 + 
  50.    时间:2012-8-13 By Dewei 
  51. */  
  52. CString urlencode(CString &str_source)  
  53. {  
  54.     char const *in_str = str_source;  
  55.     int in_str_len = strlen(in_str);  
  56.     int out_str_len = 0;  
  57.     CString out_str = '\0';  
  58.     register unsigned char c;  
  59.     unsigned char *to, *start;  
  60.     unsigned char const *from, *end;  
  61.     unsigned char hexchars[] = "0123456789ABCDEF";  
  62.   
  63.     from = (unsigned char *)in_str;  
  64.     end = (unsigned char *)in_str + in_str_len;  
  65.     start = to = (unsigned char *) malloc(3*in_str_len+1);  
  66.   
  67.     while (from < end) {  
  68.         c = *from++;  
  69.   
  70.         if (c == ' ') {  
  71.             *to++ = '+';  
  72.         } else if ((c < '0' && c != '-' && c != '.') ||  
  73.             (c < 'A' && c > '9') ||  
  74.             (c > 'Z' && c < 'a' && c != '_') ||  
  75.             (c > 'z')) {   
  76.                 to[0] = '%';  
  77.                 to[1] = hexchars[c >> 4];  
  78.                 to[2] = hexchars[c & 15];  
  79.                 to += 3;  
  80.         } else {  
  81.             *to++ = c;  
  82.         }  
  83.     }  
  84.     *to = 0;  
  85.   
  86.     out_str_len = to - start;  
  87.     out_str = (char *) start;  
  88.     free(start);  
  89.     return out_str;  
  90. }  
0 0