转载自:http://blog.csdn.net/langeldep/article/details/6264058

本文代码为从PHP代码中修改而来,只保留了2个函数。

int php_url_decode(char *str, int len);
char *php_url_encode(char const *s, int len, int *new_length);

URL编码做了如下操作:

字符"a"-"z","A"-"Z","0"-"9",".","-","*",和"_" 都不被编码,维持原值;

空格" "被转换为加号"+"。

其他每个字节都被表示成"%xy"格式的由3个字符组成的字符串,编码为UTF-8。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <ctype.h>
  5. #include <sys/types.h>
  6.  
  7. static unsigned char hexchars[] = "0123456789ABCDEF";
  8. /**
    * 16进制数转换成10进制数
    * 如:0xE4=14*16+4=228
    */
  9. static int php_htoi(char *s)
  10. {
  11. int value;
  12. int c;
  13.  
  14. c = ((unsigned char *)s)[];
  15. if (isupper(c))
  16. c = tolower(c);
  17. value = (c >= '' && c <= '' ? c - '' : c - 'a' + ) * ;
  18.  
  19. c = ((unsigned char *)s)[];
  20. if (isupper(c))
  21. c = tolower(c);
  22. value += c >= '' && c <= '' ? c - '' : c - 'a' + ;
  23.  
  24. return (value);
  25. }
  26.  
  27. char *php_url_encode(char const *s, int len, int *new_length)
  28. {
  29. register unsigned char c;
  30. unsigned char *to, *start;
  31. unsigned char const *from, *end;
  32.  
  33. from = (unsigned char *)s;
  34. end = (unsigned char *)s + len;
  35. start = to = (unsigned char *) calloc(, *len+);
  36.  
  37. while (from < end)
  38. {
  39. c = *from++;
  40.  
  41. if (c == ' ')
  42. {
  43. *to++ = '+';
  44. }
  45. else if ((c < '' && c != '-' && c != '.') ||
  46. (c < 'A' && c > '') ||
  47. (c > 'Z' && c < 'a' && c != '_') ||
  48. (c > 'z'))
  49. {
  50. to[] = '%';
  51. to[] = hexchars[c >> ];//将2进制转换成16进制表示
  52. to[] = hexchars[c & ];//将2进制转换成16进制表示
  53. to += ;
  54. }
  55. else
  56. {
  57. *to++ = c;
  58. }
  59. }
  60. *to = ;
  61. if (new_length)
  62. {
  63. *new_length = to - start;
  64. }
  65. return (char *) start;
  66. }
  67.  
  68. int php_url_decode(char *str, int len)
  69. {
  70. char *dest = str;
  71. char *data = str;
  72.  
  73. while (len--)
  74. {
  75. if (*data == '+')
  76. {
  77. *dest = ' ';
  78. }
  79. else if (*data == '%' && len >= && isxdigit((int) *(data + )) && isxdigit((int) *(data + )))
  80. {
  81. *dest = (char) php_htoi(data + );
  82. data += ;
  83. len -= ;
  84. }
  85. else
  86. {
  87. *dest = *data;
  88. }
  89. data++;
  90. dest++;
  91. }
  92. *dest = '\0';
  93. return dest - str;
  94. }
  95.  
  96. int main(int argc, char ** argv)
  97. {
  98. char *str = "你好,世界!",*new_str;
  99. int len = ,new_len = ,old_len = ;
  100. len = strlen(str);
  101. new_str = php_url_encode(str,len,&new_len);
  102. printf("new string : %s,new length : %d\n",new_str,new_len);
  103. old_len = php_url_decode(new_str,new_len);
  104. printf("old string : %s,old length : %d\n",new_str,old_len);
  105. return ;
  106. }

ps:查了好多资料才弄明白urldecode的原理,原来如此简单,呵呵

URL encode 与 URL decode 的C语言实现的更多相关文章

  1. URLEncoder.encode 和 URLDecoder.decode 处理url的特殊参数

    在使用 url 的 queryString 传递参数时,因为参数的值,被DES加密了,而加密得到的是 Base64的编码字符串,类似于: za4T8MHB/6mhmYgXB7IntyyOUL7Cl++ ...

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

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

  3. get请求中的url encode问题

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

  4. ios Url Encode

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

  5. Swift URL encode

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

  6. ASP.NET根据URL生成网页缩略图示例程序(C#语言)

    工作中可能马上要用到根据URL生成网页缩略图功能,提前做好准备. 在网上找了份源码,但是有错误:当前线程不在单线程单元中,因此无法实例化 ActiveX 控件“8856f961-340a-11d0-a ...

  7. 【Web】URI和URL,及URL的编码

    URI和URL是什么,以及他们的区别 URL,Uniform Resource Locator,统一资源定位符.用于表示网络上服务器的资源所在位置,比如我们输入浏览器的地址. URI,Uniform ...

  8. URL参数为url,获取不到部分参数问题

    url1中的参数含有url2,在页面上获取url时发现url后面跟的参数获取不到,其实是浏览器把url2中&后的参数作为url1的参数来处理了. 如:http://www.ilcng.com/ ...

  9. php 对url 操作类:url拼接、get获取页面、post获取页面(带传参)

    /* * @brief url封装类,将常用的url请求操作封装在一起 * */ class URL{ private $error; public function __construct(){ $ ...

随机推荐

  1. phpstudy配置虚拟主机

    配置 phpstudy 虚拟主机 1在httpd.conf中  把#Include conf/extra/httpd-vhosts.conf前面的#去掉 2在站点域名管理 添加 要配置的 虚拟主机 添 ...

  2. Ajax 表单验证 实现代码

    兼容: opera 9.6 + chrome 2.0 + FF 3 + IE 6 效果:一边输入一边实现验证 image 环境:ruby 1.8.6 + rails 2.1.0 + windows 核 ...

  3. Java的finally理解

    1.为什么要用finally 先看一个没有finally的异常处理try-catch语句: 如果count为要使用到的资源,而且用完要求释放此资源.那么我们能够把释放资源的语句放到try-catch后 ...

  4. [Javascript] IIFE

    Javascript modules are a design pattern that allow you to encapsulate your code into smaller self ma ...

  5. 基于Qt的第三方库和控件

    ====================== 基于Qt的第三方库和控件 ======================     libQxt --------   http://dev.libqxt.o ...

  6. Performance Tuning of Spring/Hibernate Applications---reference

    http://java.dzone.com/articles/performance-tuning For most typical Spring/Hibernate enterprise appli ...

  7. 深入理解iframe

    本文并不是一篇iframe API文档讲解,因此想了解iframe API的同学请移步 MDN, 我将在现在浏览器的角度与大家取探讨iframe, 因此,本文中虽然会提及一些iframe在旧浏览器中的 ...

  8. XC文件管理器(Android应用)

    XC文件管理器,是基于Android4.4开发的一个方便易用的文件管理器,具有文件的目录管理和文件的管理,主要包括文件的新建.删除.重命名.复制,移动剪切以及文件详情查看等文件和目录的功能,同时支持文 ...

  9. Eclipse3.7中搭建Android开发环境文档教程和视频教程

    1.下载Eclipse3.7,登录http://www.eclipse.org/downloads/,下载Eclipse Classic 3.7: 2.安装ADT插件:下载好Eclipse后解压,运行 ...

  10. RedHat7搭建MongoDB

    yum安装MongoDB 添加MongoDB源# vi /etc/yum.repos.d/mongodb-org-3.0.repo [mongodb-org-3.0] name=MongoDB Rep ...