URL encode 与 URL decode 的C语言实现

来源:互联网 发布:小ck 知乎 编辑:程序博客网 时间:2024/05/17 10:57

 本文代码为从PHP代码中修改而来,只保留了2个函数。

 

int php_url_decode(char *str, int len);
char *php_url_encode(char const *s, int len, int *new_length);

 

URL编码做了如下操作:

字符"a"-"z""A"-"Z""0"-"9"".""-""*",和"_" 都不被编码,维持原值;

空格" "被转换为加号"+"

其他每个字节都被表示成"%xy"格式的由3个字符组成的字符串,编码为UTF-8

 

头文件如下

 

[cpp] view plaincopy
  1. #ifndef URL_H  
  2. #define URL_H  
  3.   
  4. #ifdef __cplusplus  
  5. extern "C" {  
  6. #endif  
  7.   
  8. int php_url_decode(char *str, int len);  
  9. char *php_url_encode(char const *s, int len, int *new_length);  
  10.   
  11. #ifdef __cplusplus  
  12. }  
  13. #endif  
  14.   
  15. #endif /* URL_H */  

 

 

C文件如下:

 

[cpp] view plaincopy
  1. #include <stdlib.h>  
  2. #include <string.h>  
  3. #include <ctype.h>  
  4. #include <sys/types.h>  
  5.   
  6. #include "url.h"  
  7.   
  8. static unsigned char hexchars[] = "0123456789ABCDEF";  
  9.   
  10. static int php_htoi(char *s)  
  11. {  
  12.     int value;  
  13.     int c;  
  14.   
  15.     c = ((unsigned char *)s)[0];  
  16.     if (isupper(c))  
  17.         c = tolower(c);  
  18.     value = (c >= '0' && c <= '9' ? c - '0' : c - 'a' + 10) * 16;  
  19.   
  20.     c = ((unsigned char *)s)[1];  
  21.     if (isupper(c))  
  22.         c = tolower(c);  
  23.     value += c >= '0' && c <= '9' ? c - '0' : c - 'a' + 10;  
  24.   
  25.     return (value);  
  26. }  
  27.   
  28.   
  29. char *php_url_encode(char const *s, int len, int *new_length)  
  30. {  
  31.     register unsigned char c;  
  32.     unsigned char *to, *start;  
  33.     unsigned char const *from, *end;  
  34.       
  35.     from = (unsigned char *)s;  
  36.     end  = (unsigned char *)s + len;  
  37.     start = to = (unsigned char *) calloc(1, 3*len+1);  
  38.   
  39.     while (from < end)   
  40.     {  
  41.         c = *from++;  
  42.   
  43.         if (c == ' ')   
  44.         {  
  45.             *to++ = '+';  
  46.         }   
  47.         else if ((c < '0' && c != '-' && c != '.') ||  
  48.                  (c < 'A' && c > '9') ||  
  49.                  (c > 'Z' && c < 'a' && c != '_') ||  
  50.                  (c > 'z'))   
  51.         {  
  52.             to[0] = '%';  
  53.             to[1] = hexchars[c >> 4];  
  54.             to[2] = hexchars[c & 15];  
  55.             to += 3;  
  56.         }  
  57.         else   
  58.         {  
  59.             *to++ = c;  
  60.         }  
  61.     }  
  62.     *to = 0;  
  63.     if (new_length)   
  64.     {  
  65.         *new_length = to - start;  
  66.     }  
  67.     return (char *) start;  
  68. }  
  69.   
  70.   
  71. int php_url_decode(char *str, int len)  
  72. {  
  73.     char *dest = str;  
  74.     char *data = str;  
  75.   
  76.     while (len--)   
  77.     {  
  78.         if (*data == '+')   
  79.         {  
  80.             *dest = ' ';  
  81.         }  
  82.         else if (*data == '%' && len >= 2 && isxdigit((int) *(data + 1)) && isxdigit((int) *(data + 2)))   
  83.         {  
  84.             *dest = (char) php_htoi(data + 1);  
  85.             data += 2;  
  86.             len -= 2;  
  87.         }   
  88.         else   
  89.         {  
  90.             *dest = *data;  
  91.         }  
  92.         data++;  
  93.         dest++;  
  94.     }  
  95.     *dest = '/0';  // *dest =0; 用这个好些
  96.     return dest - str;  
  97. }