URL Encode

时间:2023-03-10 03:56:11
URL Encode
用VC实现post数据常常会遇到URL编码问题
在此封装一个工具类进行UTF8编码的转换
源码来自php source code
只是简单的封装给C++调用
  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. }