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

Technorati 标签: urlencode,urldecode

先看个例子:

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

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

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

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

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

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

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

http://hi.baidu.com/leejun_2005/item/9e0f4e4ba62cde0bc11613b5
解码:

/** =====================================================================================*       Filename:  url_decode.cpp*    Description:  url decode**        Created:  07/06/2012 07:35:14 PM*         Author:  zhy (), izualzhy@163.com* =====================================================================================*/#include <stdio.h>
#include <string.h>#define NON_NUM '0'int hex2num(char c)
{if (c>='0' && c<='9') return c - '0';if (c>='a' && c<='z') return c - 'a' + 10;//这里+10的原因是:比如16进制的a值为10if (c>='A' && c<='Z') return c - 'A' + 10;printf("unexpected char: %c", c);return NON_NUM;
}/*** @brief URLDecode 对字符串URL解码,编码的逆过程** @param str 原字符串* @param strSize 原字符串大小(不包括最后的\0)* @param result 结果字符串缓存区* @param resultSize 结果地址的缓冲区大小(包括最后的\0)** @return: >0 result 里实际有效的字符串长度*            0 解码失败*/
int URLDecode(const char* str, const int strSize, char* result, const int resultSize)
{char ch,ch1,ch2;int i;int j = 0;//record result indexif ((str==NULL) || (result==NULL) || (strSize<=0) || (resultSize<=0)) {return 0;}for ( i=0; (i<strSize) && (j<resultSize); ++i) {ch = str[i];switch (ch) {case '+':result[j++] = ' ';break;case '%':if (i+2<strSize) {ch1 = hex2num(str[i+1]);//高4位ch2 = hex2num(str[i+2]);//低4位if ((ch1!=NON_NUM) && (ch2!=NON_NUM))result[j++] = (char)((ch1<<4) | ch2);i += 2;break;} else {break;}default:result[j++] = ch;break;}}result[j] = 0;return j;
}int main(int argc, char* argv[])
{char* src = argv[1];char obj[100] = {0};unsigned int len = strlen(src);int resultSize = URLDecode(src, len, obj, 100);printf("result: %d, %s\n", resultSize, obj);return 0;}

编码:

/** =====================================================================================*       Filename:  url_encode.cpp*    Description:  url encode**        Created:  07/04/2012 08:32:24 PM**         Author:  zhy (), izualzhy@163.com* =====================================================================================*/
#include <stdio.h>
#include <string.h>/*** @brief URLEncode 对字符串URL编码** @param str 原字符串* @param strSize 原字符串长度(不包括最后的\0)* @param result 结果缓冲区的地址* @param resultSize 结果缓冲区的大小(包括最后的\0)** @return: >0:resultstring 里实际有效的长度*            0: 解码失败.*/
int URLEncode(const char* str, const int strSize, char* result, const int resultSize)
{int i;int j = 0;//for result indexchar ch;if ((str==NULL) || (result==NULL) || (strSize<=0) || (resultSize<=0)) {return 0;}for ( i=0; (i<strSize)&&(j<resultSize); ++i) {ch = str[i];if (((ch>='A') && (ch<'Z')) ||((ch>='a') && (ch<'z')) ||((ch>='0') && (ch<'9'))) {result[j++] = ch;} else if (ch == ' ') {result[j++] = '+';} else if (ch == '.' || ch == '-' || ch == '_' || ch == '*') {result[j++] = ch;} else {if (j+3 < resultSize) {sprintf(result+j, "%%%02X", (unsigned char)ch);j += 3;} else {return 0;}}}result[j] = '\0';return j;
}int main(int argc, char* argv[])
{char* src = argv[1];unsigned int srclength = strlen(src);printf("src length: %d\n", strlen(src));char obj[100] = {0};URLEncode(src, srclength, obj, 100);printf("obj: %s\n", obj);printf("obj: %d\n", strlen(obj));return 0;
}

输出:

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, 使用位移。

参考:

http://hi.baidu.com/zkheartboy/blog/item/5813a28fa0d224ebf11f363d.html

http://hi.baidu.com/leejun_2005/item/9e0f4e4ba62cde0bc11613b5

C语言实现encode和decode相关推荐

  1. 2019年2月26日 Unique Email Addresses、To Lower Case、Encode and Decode TinyURL

    今天开始加快速度,趁着还有空多刷几题,语言换成python提高速度了. 1. Unique Email Addresses 弱题,注意@符号前后的处理方式不同 class Solution(objec ...

  2. pythonunicode和str_python的str,unicode对象的encode和decode方法

    python的str,unicode对象的encode和decode方法 python中的str对象其实就是"8-bit string" ,字节字符串,本质上类似java中的byt ...

  3. python中的encode()和decode()函数

    对于很多人来说,python的中字符转码是一件很头疼的事情,本来期望结果输出的是中文,结果来一段像这样\xe4\xbd\xa0\xe5\xa5\xbd像是乱码的字符串. 由于学python没多久,昨天 ...

  4. pythonencode_python的encode和decode误读总结

    python的encode和decode误读总结 最近在学Python,对编码有个误解的地方 下面是错误的理解: encode():编码,将对象的编码转换为指定编码格式,按照字面理解,一直以为是其他编 ...

  5. [转]python新手必碰到的问题---encode与decode,中文乱码--转载

    edu.codepub.com/2009/1029/17037.php 这个问题在python3.0里已经解决了. 这有篇很好的文章,可以明白这个问题: 为什么会报错"UnicodeEnco ...

  6. mark python新手必碰到的问题---encode与decode,中文乱码[转]

    转自:http://blog.csdn.net/a921800467b/article/details/8579510 为什么会报错"UnicodeEncodeError:'ascii' c ...

  7. 编码格式(UTF-8 与 ANSI)各种编码解码(encode、decode)

    Windows:默认为 ANSI,记事本程序另存为处,可以设置其他编码格式: Ubuntu:默认为 UTF-8 1. ANSI ANSI 编码表示英文字符时用一个字节,表示中文用两个或四个字节 -- ...

  8. 编码与解码(encode、decode)

    编码与解码(encode.decode) 一.什么是编码: 例:从文字到0.1的映射称为编码 将文本字符编成一系列的0和1 聚义来说就是将字母数字及标点符号编一个号.一个字节可以表示256个数字,表示 ...

  9. 初学Python:encode、decode和Unicode等

    本人是Python的初学者,阐述不到位或者不对之处,敬请见谅! 首先搞清楚:字符串在Python内部的表示是unicode编码,我一般在Python代码开始,加上: reload(sys) sys.s ...

最新文章

  1. 机器人进攻民用市场:踏实做好小优美
  2. java.io.StreamCorruptedException: invalid stream header: EFBFBDEF 问题解决
  3. nslookup命令dns请求超时_网络工程师之nslookup命令
  4. Py之pandas:对dataframe型数据排序相关的问题总结之按照多个字段的多个条件进行排序(先打乱再排序)
  5. 【我的Android进阶之旅】Android 源代码中的Java代码中//$NON-NLS-1$ 注释是什么意思?...
  6. HDU - 1150 Machine Schedule(最小点覆盖-二分图最大匹配)
  7. Python3爬虫之中文乱码问题分析与解决方法
  8. 负载均衡集群介绍LVS介绍LVS调度算法LVS NAT模式搭建
  9. C#反射调用类的私有方法
  10. kafka 集群搭建步骤
  11. kdays 游戏汉化教程[日记版本] 序章 接触
  12. python与图像处理书籍_数字图像处理与Python实现
  13. [架构之路-32]:目标系统 - 系统软件 - Linux OS用户空间程序的启动、关闭、监管 -- init进程
  14. 防范WiFi探针嗅探敏感数据的保护方法
  15. STM32—串口通讯详解
  16. 图解HTTP十一:Web 的攻击技术
  17. 【传感器模块】 HC-SR501 人体红外感应模块 热释电 红外传感器
  18. 网吧组网新趋势:双光纤接入+千兆到桌面(转)
  19. 阿里云服务器安装redis
  20. 无人机飞控平台ArduPilot源码入门教程 - 首页

热门文章

  1. mysql crash_Mysql 无故crash
  2. 快速了解FAT32文件系统
  3. python私有方法应用场景_Python私有属性私有方法应用实例解析
  4. 树莓派:树莓派的刷机和登录,以及更新新版vim方便使用
  5. fwr171改无线服务器,迅捷(Fast)FWR171无线AP模式设置
  6. 结构指针的坑之(定义结构体指针时并没有分配存储空间,所以要用malloc()申请空间)
  7. MATLAB从入门到精通-缺失值和异常值的处理应用案例
  8. Linux从入门到精通系列之sed命令使用方法
  9. 非常值得收藏的 IBM SPSS Modeler 算法简介
  10. python杨辉三角_干货|杨辉三角与二项式定理