zoukankan      html  css  js  c++  java
  • URL Encode

    用VC实现post数据常常会遇到URL编码问题
    在此封装一个工具类进行UTF8编码的转换
    源码来自php source code
    只是简单的封装给C++调用
     
    [cpp] view plaincopy
     
    1. //URL 编解码类  
    2. //来自PHP源码  
    3. class CRtUrlConv  
    4. {  
    5. public:  
    6.     static char *urlencode(const char *in_str )   
    7.     {   
    8.         char *out_str;   
    9.         int in_str_len, out_str_len;   
    10.         in_str_len=strlen(in_str);   
    11.         out_str_len=0;   
    12.         out_str =  php_url_encode( in_str , in_str_len, &out_str_len);   
    13.         return (char *) out_str;   
    14.     }  
    15.     static int urldecode(char *s)  
    16.     {  
    17.         return php_url_decode(s);  
    18.     }  
    19. private:  
    20.     static char *php_url_encode(const char *s , int len , int *new_length)   
    21.     {   
    22.         register unsigned char c;   
    23.         unsigned char *to, *start;   
    24.         unsigned char const *from, *end;   
    25.         from = (unsigned char *)s;   
    26.         end = (unsigned char *)s + len;   
    27.         start = to = new unsigned char[3*len+1];  
    28.         while (from < end) {   
    29.             c = *from++;    
    30.             if (c == ' ') {   
    31.                 *to++ = '+';   
    32. #ifndef CHARSET_EBCDIC   
    33.             } else if ((c < '0' && c != '-' && c != '.') ||   
    34.                 (c < 'A' && c > '9') ||   
    35.                 (c > 'Z' && c < 'a' && c != '_') ||   
    36.                 (c > 'z')) {   
    37.                     to[0] = '%';   
    38.                     to[1] = HEXCHARS[c >> 4];   
    39.                     to[2] = HEXCHARS[c & 15];   
    40.                     to += 3;   
    41. #else /*CHARSET_EBCDIC*/   
    42.             } else if (!isalnum(c) && strchr("_-.", c) == NULL) {   
    43.                 /* Allow only alphanumeric chars and '_', '-', '.'; escape the rest */   
    44.                 to[0] = '%';   
    45.                 to[1] = HEXCHARS[os_toascii[c] >> 4];   
    46.                 to[2] = HEXCHARS[os_toascii[c] & 15];   
    47.                 to += 3;   
    48. #endif /*CHARSET_EBCDIC*/   
    49.             } else {   
    50.                 *to++ = c;   
    51.             }   
    52.         }   
    53.         *to = 0;   
    54.         if (new_length) {   
    55.             *new_length = to - start;   
    56.         }   
    57.         return (char *) start;   
    58.     }   
    59.     static int php_url_decode(char *str)   
    60.     {   
    61.         int len;   
    62.         char *dest = str;   
    63.         char *data = str;   
    64.         len=strlen(str);   
    65.         while (len--) {   
    66.             if (*data == '+') {   
    67.                 *dest = ' ';   
    68.             }   
    69.             else if (*data == '%' && len >= 2 && isxdigit((int) *(data + 1))    
    70.                 && isxdigit((int) *(data + 2))) {   
    71. #ifndef CHARSET_EBCDIC   
    72.                     *dest = (char) php_htoi(data + 1);   
    73. #else   
    74.                     *dest = os_toebcdic[(char) php_htoi(data + 1)];   
    75. #endif   
    76.                     data += 2;   
    77.                     len -= 2;   
    78.                 } else {   
    79.                     *dest = *data;   
    80.                 }   
    81.                 data++;   
    82.                 dest++;   
    83.         }   
    84.         *dest = '/0';   
    85.         return dest - str;   
    86.     }  
    87.     static int php_htoi(char *s)   
    88.     {   
    89.         int value;   
    90.         int c;   
    91.         c = ((unsigned char *)s)[0];   
    92.         if (isupper(c))   
    93.             c = tolower(c);   
    94.         value = (c >= '0' && c <= '9' ? c - '0' : c - 'a' + 10) * 16;   
    95.         c = ((unsigned char *)s)[1];   
    96.         if (isupper(c))   
    97.             c = tolower(c);   
    98.         value += c >= '0' && c <= '9' ? c - '0' : c - 'a' + 10;   
    99.         return (value);   
    100.     }   
    101.     static const char hexchars[];  
    102.     static const char HEXCHARS[];  
    103. };  
    104. const char CRtUrlConv::hexchars[] = "0123456789abcdef";   
    105. const char CRtUrlConv::HEXCHARS[] = "0123456789ABCDEF";  
    106. }  
     
  • 相关阅读:
    C++之容器
    C++之复制控制
    TCP的3次握手/4次握手
    linux编程之多线程编程
    linux编程之信号
    linux编程之共享内存
    MySQL数据库优化
    MySQL存储引擎InnoDB与Myisam
    Redis--持久化
    Redis 请求应答模式和往返延时 Pipelining
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/3708365.html
Copyright © 2011-2022 走看看