用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. }

URL Encode的更多相关文章

  1. iOS/Android/Web Url Encode空格處理 原文連結:http://read01.com/3gDO.html

    iOS/Android/Web Url Encode空格處理 原文連結:http://read01.com/3gDO.html 前言 這裡只是講一個故事,一個發生在我身上的真實的故事.曾經,我以為搞加 ...

  2. get请求中的url encode问题

    首先发表一下感慨,Python的requests模块确实太简便,省却了很多的转码等等等等的问题,但这也是缺点,对于我这种基础不好的同学来说让我少知道了许多本来应该知道的东西. url encode: ...

  3. ios Url Encode

    //ios Url Encode //有时候在请求的参数里里特殊符号比如“+”等.而如果没有encode的话那么传过去的还是” ”,面实际上是%2B. -(NSString*)UrlValueEnco ...

  4. Swift URL encode

    前言 在WEB前端开发,服务器后台开发,或者是客户端开发中,对URL进行编码是一件很常见的事情,但是由于各个年代的RFC文档中的内容一直在变化,一些年代久远的代码就对URL编码和解码的规则和现在的有一 ...

  5. 为什么要做url encode

    因为 url 对字符有限制,比如把一个邮箱放入 url,就需要使用 urlencode 函数,因为 url 中不能包含 @ 字符.

  6. URL encode 与 URL decode 的C语言实现

    转载自:http://blog.csdn.net/langeldep/article/details/6264058 本文代码为从PHP代码中修改而来,只保留了2个函数. int php_url_de ...

  7. C++语言的url encode 和decode

    std::string UrlEncode(const std::string& szToEncode) { std::string src = szToEncode; char hex[] ...

  8. Java与.net 关于URL Encode 的区别

    在c#中,HttpUtility.UrlEncode("www+mzwu+com")编码结果为www%2bmzwu%2bcom,在和Java开发的平台做对接的时候,对方用用url编 ...

  9. 关于URL encode和parse

    from urllib import parses = 'https://www.baidu.com/s?ie=utf-8&f=3&rsv_bp=1&tn=baidu& ...

随机推荐

  1. 洛谷P2881 [USACO07MAR]排名的牛Ranking the Cows(bitset Floyd)

    题意 题目链接 Sol 显然如果题目什么都不说的话需要\(\frac{n * (n - 1)}{2}\)个相对关系 然后求一下传递闭包减掉就行了 #include<bits/stdc++.h&g ...

  2. ionic左滑删除

    <html ng-app="ionicApp"> <head> <meta charset="utf-8"> <met ...

  3. 微信小程序开发--宽为百分百,页面仍可左右滑动

    这段时间小程序开发时,很多时候,希望内容充满整个屏幕(高度.宽度100%),如下图 但是在设置 .followrecords-container{width:100%;} 后发现 手机在横向上虽然页面 ...

  4. DOS中的ECHO命令详解

    1. 作为控制批处理命令在执行时是否显示命令行自身的开关  格式:ECHO [ON|OFF]  如果想关闭“ECHO OFF”命令行自身的显示,则需要在该命令行前加上“@”.  2. 显示当前ECHO ...

  5. Windows 自动更新服务恢复

    之前手贱删除了Windows的自动更新服务,命令: SC DELETE Wuauserv 悲剧的是最近中了[永恒之蓝]病毒,很恼人!杀了毒,最后还是得仰仗Windows的补丁来加固系统.于是想通过SC ...

  6. SQL Server全文搜索

    SQL Server全文搜索 看这篇文章之前请先看一下下面我摘抄的全文搜索的MSDN资料,基本上MSDN上关于全文搜索的资料的我都copy下来了 并且非常认真地阅读和试验了一次,并且补充了一些SQL语 ...

  7. 像azure一样桌面显示Windows系统信息

    介绍 我们在使用azure的公有云时,可以看到打开虚拟机时右上角可以显示系统配置信息和公网私有地址,很好奇如何做到的,终于经过询问一位微软的朋友,他帮我找到了这个工具 工具地址:https://tec ...

  8. python 多进程和子进程1

    多进程的缓冲区 #多进程 process.py from multiprocessing import Process,current_process import time def func1(): ...

  9. 学习python 第一章

    目录 第一章... 1 1:新建项目... 1 2:修改默认模板... 3 3:什么是变量... 3 4:重指向... 3 5:常量的表示... 4 6:格式化输出(三种方法)... 4 7:打印一个 ...

  10. OpenGL超级宝典笔记——画三角形(转)

    http://my.oschina.net/sweetdark/blog/161002 学习了画线的知识,我们可以使用GL_LINE_LOOP来画闭合的多边形.但是使用这种方式画出来的只有线框,多边形 ...