关于UrlEncode的实现(C++)。网上有非常多不同的版本号。对须要编码的字符集的选取并不统一。那么究竟有没有标准呢?答案是有的。參见wiki

绝对不编码的,仅仅有字母、数字、短横线(-)、下划线(_)、点(.)和波浪号(~),其它字符要视情况而定。所以一般性的urlencode仅仅需保留上述字符不进行编码。

以下给出实现:

  1. unsigned char ToHex(unsigned char x)
  2. {
  3. return  x > 9 ? x + 55 : x + 48;
  4. }
  5. unsigned char FromHex(unsigned char x)
  6. {
  7. unsigned char y;
  8. if (x >= 'A' && x <= 'Z') y = x - 'A' + 10;
  9. else if (x >= 'a' && x <= 'z') y = x - 'a' + 10;
  10. else if (x >= '0' && x <= '9') y = x - '0';
  11. else assert(0);
  12. return y;
  13. }
  14. std::string UrlEncode(const std::string& str)
  15. {
  16. std::string strTemp = "";
  17. size_t length = str.length();
  18. for (size_t i = 0; i < length; i++)
  19. {
  20. if (isalnum((unsigned char)str[i]) ||
  21. (str[i] == '-') ||
  22. (str[i] == '_') ||
  23. (str[i] == '.') ||
  24. (str[i] == '~'))
  25. strTemp += str[i];
  26. else if (str[i] == ' ')
  27. strTemp += "+";
  28. else
  29. {
  30. strTemp += '%';
  31. strTemp += ToHex((unsigned char)str[i] >> 4);
  32. strTemp += ToHex((unsigned char)str[i] % 16);
  33. }
  34. }
  35. return strTemp;
  36. }
  37. std::string UrlDecode(const std::string& str)
  38. {
  39. std::string strTemp = "";
  40. size_t length = str.length();
  41. for (size_t i = 0; i < length; i++)
  42. {
  43. if (str[i] == '+') strTemp += ' ';
  44. else if (str[i] == '%')
  45. {
  46. assert(i + 2 < length);
  47. unsigned char high = FromHex((unsigned char)str[++i]);
  48. unsigned char low = FromHex((unsigned char)str[++i]);
  49. strTemp += high*16 + low;
  50. }
  51. else strTemp += str[i];
  52. }
  53. return strTemp;
  54. }

最新文章

  1. ZKWeb网页框架1.2正式发布
  2. 差分:IncDec Sequence 差分数组
  3. 【转载】Unity 优雅地管理资源,减少占用内存,优化游戏
  4. ABAP 表格控制(Table Control)和步循环
  5. web.xml 中的listener、 filter、servlet 加载顺序
  6. Android四大组件之一:Activity
  7. WPF实现摄像头镜像翻转
  8. 【转】 Android ListView与Button的显示----不错不错
  9. HDU 2167 Pebbles
  10. HDU-2647拓扑排序
  11. excel 常用函数
  12. hash随笔
  13. 过滤器复用代码【中文乱码、HTML转义】
  14. Java数组协变与范型不变性
  15. ModelBiner不验证某个属性
  16. flutter -------- ListView的使用
  17. MySQL分布式事物(XA事物)的使用
  18. FileInputStream、FileReader、FileWriter和File
  19. Tomcat 跨域问题的解决
  20. 转载:approxPolyDP函数

热门文章

  1. ASP.NET-HTTP管道模型
  2. [ReactVR] Render Custom 3D Objects Using the Model Component in React VR
  3. 数据结构与算法系列----最小生成树(Prim算法&amp;amp;Kruskal算法)
  4. CSS3弹性布局内容对齐(justify-content)属性使用具体解释
  5. node08---Express框架
  6. 基于FPGA的跨时钟域信号处理——专用握手信号
  7. m_Orchestrate learning system---十七、页面美观的关键是什么
  8. javascript系列-class8.BOM
  9. javascript系列-class5.数组
  10. vue中响应式props办法