c语言 encode,C语言实现encode和decode

这篇博客介绍了如何在C语言中实现URL编码(URLEncode)和解码(URLDecode)函数,提供了完整的代码示例。通过示例展示了汉字在URL中的编码规则,并解释了编码和解码过程的重要性,特别是对于处理包含中文字符的URL参数时。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

此文章出处:http://www.cppblog.com/izualzhy/archive/2012/07/09/182456.html

先看个例子:

汉字 一 的UTF-8编码为0xE4 0xb8 0x 80

我们在google里搜索一下“一”,地址栏显示为:

0818b9ca8b590ca3270a3433284dd417.png

可以看到url的字符串里有一个%E4%B8%80

这就是encode之后的值。因此,encode的处理过程也很明显了。

特别是传中文参数时,如果没有encode,很容易出错。

至于为什么要这么传,就不知道了,今天,现来看下C语言如何实现url encode函数.

首先是urlencode的编码规则,可以看这里,搜到一篇文章没有仔细研究,可能有不全的地方:

/*

* =====================================================================================

* Filename: url_decode.cpp

* Description: url decode

*

* Created: 07/06/2012 07:35:14 PM

* Author: zhy (), izualzhy@163.com

* =====================================================================================

*/#include#include#defineNON_NUM '0'inthex2num(charc)

{if(c>='0'&&c<='9')returnc -'0';if(c>='a'&&c<='z')returnc -'a'+10;//这里+10的原因是:比如16进制的a值为10if(c>='A'&&c<='Z')returnc -'A'+10;printf("unexpected char: %c",c);returnNON_NUM;

}/**

* @brief URLDecode 对字符串URL解码,编码的逆过程

*

* @param str 原字符串

* @param strSize 原字符串大小(不包括最后的\0)

* @param result 结果字符串缓存区

* @param resultSize 结果地址的缓冲区大小(包括最后的\0)

*

* @return: >0 result 里实际有效的字符串长度

* 0 解码失败

*/intURLDecode(const char*str,const intstrSize,char*result,const intresultSize)

{charch,ch1,ch2;inti;intj =0;//record result indexif((str==NULL) || (result==NULL) || (strSize<=0) || (resultSize<=0)) {return0;

}for(i=0; (i

}else{break;

}default:result[j++] =ch;break;

}

}result[j] =0;returnj;

}intmain(intargc,char*argv[])

{char*src =argv[1];charobj[100] = {0};unsigned intlen =strlen(src);intresultSize =URLDecode(src,len,obj,100);printf("result: %d, %s\n",resultSize,obj);return0;

}

编码:

/*

* =====================================================================================

* Filename: url_encode.cpp

* Description: url encode

*

* Created: 07/04/2012 08:32:24 PM

*

* Author: zhy (), izualzhy@163.com

* =====================================================================================

*/#include#include/**

* @brief URLEncode 对字符串URL编码

*

* @param str 原字符串

* @param strSize 原字符串长度(不包括最后的\0)

* @param result 结果缓冲区的地址

* @param resultSize 结果缓冲区的大小(包括最后的\0)

*

* @return: >0:resultstring 里实际有效的长度

* 0: 解码失败.

*/intURLEncode(const char*str,const intstrSize,char*result,const intresultSize)

{inti;intj =0;//for result indexcharch;if((str==NULL) || (result==NULL) || (strSize<=0) || (resultSize<=0)) {return0;

}for(i=0; (i='A') && (ch

((ch>='a') && (ch

((ch>='0') && (ch

}else if(ch ==' ') {result[j++] ='+';

}else if(ch =='.'||ch =='-'||ch =='_'||ch =='*') {result[j++] =ch;

}else{if(j+3

}else{return0;

}

}

}result[j] ='\0';returnj;

}intmain(intargc,char*argv[])

{char*src =argv[1];unsigned intsrclength =strlen(src);printf("src length: %d\n",strlen(src));charobj[100] = {0};URLEncode(src,srclength,obj,100);printf("obj: %s\n",obj);printf("obj: %d\n",strlen(obj));return0;

}

输出:

y@y-VirtualBox:/mnt/Documents/Training$ ./url_encode 一^abc_二

src length: 11

obj: %E4%B8%80%5Eabc_%E4%BA%8C

obj: 25

y@y-VirtualBox:/mnt/Documents/Training$ ./url_decode %E4%B8%80%5Eabc_%E4%BA%8C

result: 11, 一^abc_二

使用google搜索下:

0818b9ca8b590ca3270a3433284dd417.png

注:

1.AA –> “%AA”,使用sprintf。

2.”%AA” –> AA, 使用位移。

参考:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值