用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. Ajax 滚动异步加载数据

    第一种情况:单个div滚动 HTML <body> <!-- search start --> <div class="search" #if($m_ ...

  2. 语义SLAM的数据关联和语义定位(三)

    与现有方法的异同 特征点SLAM中的数据关联 先回忆一下特征点SLAM中,我们是如何处理数据关联的.下面以ORBSLAM为例. 在初始化部分,我们通过特征描述子的相似性,建立两帧之间的特征点关联,然后 ...

  3. 安卓开发环境配置之Windows+ADT+eclipse

    安卓环境搭建之Windows+ADT+eclipse 要点: 1.安装JDK 2.安装Android SDK 3.安装eclipse 4.安装ADT 5.安装调试环境 正文: 1.安装JDK 1.1准 ...

  4. 利用ListView批量删除item

    利用CheckBox选中一个或多个item,最后批量删除它们. 程序运行效果图如下: package com.test.adapter; import java.util.ArrayList; imp ...

  5. mongodb2.X添加权限

    1.连接mongodb数据库(如果mongo命令没有做环境变量配置,需要定位到有mongo命令的目录) root@AY140709212620347s22Z:~# mongo MongoDB shel ...

  6. AngularJS简单入门

    什么是AngularJS AngularJS是一款优秀的前端JS框架,是Google多款产品之一,简称ng. ng有着诸多特性,最为核心的是:MVVM.模块化.自动化双向数据绑定.语义化标签.依赖注入 ...

  7. c#中partial 作用

    申明一下:我也是在百度上找的答案,然后合起来的,这样感觉好理解一点!partial是局部类型的意思就是说有这个关键字的类.结构或接口可以写成几个部分比如: public partial class P ...

  8. python 之__new__

    注意: 继承自object的新式类才有__new__方法 类中的__init__方法依赖__new__方法的正确返回,init中的self就是__new__返回的实例 __new__至少要有一个参数c ...

  9. 【待补充】[Linux] nc

    [nc 是做什么的] [nc怎么用] 查看帮助 nc -help # 查看帮助 nc -help # 监听端口 -l, --listen Bind and listen for incoming co ...

  10. 【转】Linxu学习---top实践

    [原文]https://www.toutiao.com/i6591053058258502147/ 在实际开发中,有时候会收到一些服务的监控报警,比如CPU飙高,内存飙高等,这个时候,我们会登录到服务 ...