本文代码为从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。

#include

#include

#include

#include

#include

static unsigned char hexchars[] = "0123456789ABCDEF";

static int php_htoi(char *s)

{

int value;

int c;

c = ((unsigned char *)s)[0];

if (isupper(c))

c = tolower(c);

value = (c >= ‘0‘ && c <= ‘9‘ ? c - ‘0‘ : c - ‘a‘ + 10) * 16;

c = ((unsigned char *)s)[1];

if (isupper(c))

c = tolower(c);

value += c >= ‘0‘ && c <= ‘9‘ ? c - ‘0‘ : c - ‘a‘ + 10;

return (value);

}

char *php_url_encode(char const *s, int len, int *new_length)

{

register unsigned char c;

unsigned char *to, *start;

unsigned char const *from, *end;

from = (unsigned char *)s;

end = (unsigned char *)s + len;

start = to = (unsigned char *) calloc(1, 3*len+1);

while (from < end)

{

c = *from++;

if (c == ‘ ‘)

{

*to++ = ‘+‘;

}

else if ((c < ‘0‘ && c != ‘-‘ && c != ‘.‘) ||

(c < ‘A‘ && c > ‘9‘) ||

(c > ‘Z‘ && c < ‘a‘ && c != ‘_‘) ||

(c > ‘z‘))

{

to[0] = ‘%‘;

to[1] = hexchars[c >> 4];

to[2] = hexchars[c & 15];

to += 3;

}

else

{

*to++ = c;

}

}

*to = 0;

if (new_length)

{

*new_length = to - start;

}

return (char *) start;

}

int php_url_decode(char *str, int len)

{

char *dest = str;

char *data = str;

while (len--)

{

if (*data == ‘+‘)

{

*dest = ‘ ‘;

}

else if (*data == ‘%‘ && len >= 2 && isxdigit((int) *(data + 1)) && isxdigit((int) *(data + 2)))

{

*dest = (char) php_htoi(data + 1);

data += 2;

len -= 2;

}

else

{

*dest = *data;

}

data++;

dest++;

}

*dest = ‘\0‘;

return dest - str;

}

int main(int argc, char ** argv)

{

char *str = "你好,世界!",*new_str;

int len = 0,new_len = 0,old_len = 0;

len = strlen(str);

new_str = php_url_encode(str,len,&new_len);

printf("new string : %s,new length : %d\n",new_str,new_len);

old_len = php_url_decode(new_str,new_len);

printf("old string : %s,old length : %d\n",new_str,old_len);

return 0;

}

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

时间: 09-06

c语言实现url编码源码,URL encode 与 URL decode 的C语言实现相关推荐

  1. 从Internet上抓取指定URL的源码的方案

    从Internet上抓取指定URL的源码的方案 作者: 引言: 在做无线项目的时候,与通讯公司的数据通讯有一部分是通过XML交互的,所以必须要动态抓取通讯公司提供的固定的Internet上的数据,便研 ...

  2. 基于 FFMPEG 的视频编码 源码(libavcodec,C++ Qt)

    基于 FFMPEG 的视频编码 源码(libavcodec,C++ Qt) 昨晚把源代码好好整理了一下,加入了视频时间限制功能.源码放这里,大家随便用. 关于代码的解释可以看我另一篇博客: 基于 FF ...

  3. 易语言QQpost加好友源码

    易语言QQpost加好友源码 以下是部分代码 .版本 2 .支持库 specGetQq (主动添加QQ) QQ空间页面 = 编码_Utf8到Ansi (网页_访问_对象 ("https:// ...

  4. 易语言窗口c_句柄取进程名,易语言窗口句柄取进程文件名源码

    窗口句柄取进程文件名系统结构:句柄取进程文件名,CreateToolhelp32Snapshot,GetWindowThreadProcessId,CloseHandle,Module32First, ...

  5. 计算机毕业设计Java-ssmC语言教学辅导网站源码+系统+数据库+lw文档

    计算机毕业设计Java-ssmC语言教学辅导网站源码+系统+数据库+lw文档 计算机毕业设计Java-ssmC语言教学辅导网站源码+系统+数据库+lw文档 本源码技术栈: 项目架构:B/S架构 开发语 ...

  6. C语言实现Base64编码转码

    C语言实现Base64编码转码 关于Base64的介绍有两篇文章已经做得非常好了:一篇是维基百科Base64的词条,如果被Q可以看本文

  7. mysql数据库+易语言的应用_易语言mysql数据应用源码

    易语言mysql数据应用源码 易语言mysql数据应用源码 系统结构:注册账号,连接Mysql,用户注册验证码,修改密码验证码,忘记密码验证码,修改密码,忘记密码, ======窗口程序集1 | | ...

  8. 易语言json置入_易语言json操作模块源码

    易语言json操作模块源码 系统结构:初始化,解析,到文本,置属性,置属性对象,置属性数值,取属性数值,取属性对象,取通用属性,取属性,成员数,加成员,取成员,取成员文本,置成员,删成员,置类型,赋值 ...

  9. c语言案例分析105,C语言实战105例源码

    C语言实战105例源码 以下程序大家如有兴趣可在文件夹下载即可 第1部分 基础篇 实例1 一个价值"三天"的BUG 2 实例2 灵活使用递增(递减)操作符 5 实例3 算术运算符计 ...

最新文章

  1. js跨域访问,No 'Access-Control-Allow-Origin' header is present on the requested resource
  2. python创建学生类和教师类_创建StudentServices类
  3. 一文搞懂负载均衡中的一致性哈希算法
  4. 手写体识别(数据挖掘入门与实践-实验11)
  5. Python | 程序以字符串长度打印单词
  6. hping3工具DOS攻击实验
  7. 用c语言编程参赛信息查询,确定参赛者名单(C语言实现)
  8. 你的项目是否真的需要 DevOps?
  9. Elasticsearch template(待续...)
  10. SQL必知必会-创建表和操纵表
  11. c/c++教程 - 1.9 指针 空指针 野指针 const修饰指针 指针常量 常量指针 指针和数组 指针和函数
  12. 【算法】二叉树遍历算法总结:前序中序后序遍历
  13. 基于stm32风力摆控制系统(电赛获得省一)
  14. Photoshop 更改图片颜色
  15. Javascript 实现的 CXK 打篮球游戏
  16. 进程调度案例分析:为何不能调度?
  17. android浏览器有桌面模式么,手机浏览器添加到主屏幕(桌面)的图标设置以及WebApp模式...
  18. 内容推荐场景下多模态语义召回的若干实践
  19. MySQL连接查询——连接查询的综合应用
  20. 为什么要限制兑换外汇额度?

热门文章

  1. 七牛云发送短信验证码
  2. Excel2016办公扫盲
  3. 计算机硬件和软件英语,计算机组成与设计:硬件/软件接口(英文版 原书第5版 ARM版)...
  4. 个推透传消息设置通知栏展示 ios_企微功能十问 | 企业微信如何开启聊天侧边栏功能,有什么用?...
  5. 音视频开发系列(24)使用FFmpeg添加、删除、替换和提取视频中的音频
  6. ABBYY FineReader OCR图文识别软件如何快速将纸质文档转为电子档教程
  7. jtag的emu0与emu1_谁特么告诉你EMU就是1分钱就能赚75美元?
  8. Java实现字母去重
  9. excel批量提取网页标题
  10. cinnamon桌面_使用Cinnamon增强您的Linux桌面