大家好,又见面了,我是你们的朋友风君子。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE稳定放心使用
此文章出处:http://www.cppblog.com/izualzhy/archive/2012/07/09/182456.html
先看个例子:
汉字 一 的UTF-8编码为0xE4 0xb8 0x 80
我们在google里搜索一下“一”,地址栏显示为:
可以看到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搜索下:
注:
1.AA –> “%AA”,使用sprintf。
2.”%AA” –> AA, 使用位移。
参考:
最新评论