URL encode 与 URL decode 的C语言实现
转载自: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。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <sys/types.h> static unsigned char hexchars[] = "0123456789ABCDEF";
/**
* 16进制数转换成10进制数
* 如:0xE4=14*16+4=228
*/
static int php_htoi(char *s)
{
int value;
int c; c = ((unsigned char *)s)[];
if (isupper(c))
c = tolower(c);
value = (c >= '' && c <= '' ? c - '' : c - 'a' + ) * ; c = ((unsigned char *)s)[];
if (isupper(c))
c = tolower(c);
value += c >= '' && c <= '' ? c - '' : c - 'a' + ; 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(, *len+); while (from < end)
{
c = *from++; if (c == ' ')
{
*to++ = '+';
}
else if ((c < '' && c != '-' && c != '.') ||
(c < 'A' && c > '') ||
(c > 'Z' && c < 'a' && c != '_') ||
(c > 'z'))
{
to[] = '%';
to[] = hexchars[c >> ];//将2进制转换成16进制表示
to[] = hexchars[c & ];//将2进制转换成16进制表示
to += ;
}
else
{
*to++ = c;
}
}
*to = ;
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 >= && isxdigit((int) *(data + )) && isxdigit((int) *(data + )))
{
*dest = (char) php_htoi(data + );
data += ;
len -= ;
}
else
{
*dest = *data;
}
data++;
dest++;
}
*dest = '\0';
return dest - str;
} int main(int argc, char ** argv)
{
char *str = "你好,世界!",*new_str;
int len = ,new_len = ,old_len = ;
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 ;
}
ps:查了好多资料才弄明白urldecode的原理,原来如此简单,呵呵
URL encode 与 URL decode 的C语言实现的更多相关文章
- URLEncoder.encode 和 URLDecoder.decode 处理url的特殊参数
在使用 url 的 queryString 传递参数时,因为参数的值,被DES加密了,而加密得到的是 Base64的编码字符串,类似于: za4T8MHB/6mhmYgXB7IntyyOUL7Cl++ ...
- iOS/Android/Web Url Encode空格處理 原文連結:http://read01.com/3gDO.html
iOS/Android/Web Url Encode空格處理 原文連結:http://read01.com/3gDO.html 前言 這裡只是講一個故事,一個發生在我身上的真實的故事.曾經,我以為搞加 ...
- get请求中的url encode问题
首先发表一下感慨,Python的requests模块确实太简便,省却了很多的转码等等等等的问题,但这也是缺点,对于我这种基础不好的同学来说让我少知道了许多本来应该知道的东西. url encode: ...
- ios Url Encode
//ios Url Encode //有时候在请求的参数里里特殊符号比如“+”等.而如果没有encode的话那么传过去的还是” ”,面实际上是%2B. -(NSString*)UrlValueEnco ...
- Swift URL encode
前言 在WEB前端开发,服务器后台开发,或者是客户端开发中,对URL进行编码是一件很常见的事情,但是由于各个年代的RFC文档中的内容一直在变化,一些年代久远的代码就对URL编码和解码的规则和现在的有一 ...
- ASP.NET根据URL生成网页缩略图示例程序(C#语言)
工作中可能马上要用到根据URL生成网页缩略图功能,提前做好准备. 在网上找了份源码,但是有错误:当前线程不在单线程单元中,因此无法实例化 ActiveX 控件“8856f961-340a-11d0-a ...
- 【Web】URI和URL,及URL的编码
URI和URL是什么,以及他们的区别 URL,Uniform Resource Locator,统一资源定位符.用于表示网络上服务器的资源所在位置,比如我们输入浏览器的地址. URI,Uniform ...
- URL参数为url,获取不到部分参数问题
url1中的参数含有url2,在页面上获取url时发现url后面跟的参数获取不到,其实是浏览器把url2中&后的参数作为url1的参数来处理了. 如:http://www.ilcng.com/ ...
- php 对url 操作类:url拼接、get获取页面、post获取页面(带传参)
/* * @brief url封装类,将常用的url请求操作封装在一起 * */ class URL{ private $error; public function __construct(){ $ ...
随机推荐
- phpstudy配置虚拟主机
配置 phpstudy 虚拟主机 1在httpd.conf中 把#Include conf/extra/httpd-vhosts.conf前面的#去掉 2在站点域名管理 添加 要配置的 虚拟主机 添 ...
- MINA学习之IoService
从上一篇文章中知道,IoService出于MINA体系中的底层.IoService将会帮你维护网络交互,接受消息,发送消息,管理Sessions,管理连接Connections等等. IoServic ...
- linux下无法删除文件的原因
不废话,直接上命令操作.记录备案以后方便查阅 [root@xxxxxxx .ssh]# rm -rf authorized_keys2 rm: 无法删除"authorized_keys2&q ...
- js模拟下载
<a id="downFile" href="" style="display: none;"><span id=&quo ...
- JavaScript网站设计实践(七)编写最后一个页面 改进表单
一.最后一个页面 contact.html.改进表单 在该页面实现的功能: 几乎所有的网站都会有表单填写,对于用户输入和填写的数据,首先我们一般现在前台验证,然后再去后台验证. 在前台最简单的验证:检 ...
- android常见错误-Installation error: INSTALL_FAILED_INSUFFICIENT_STORAGE
在andorid进行调试的过程中,出现下面的错误: 解决方法: 修改一下应用程序描述符: <manifest xmlns:android="http://schemas.android ...
- PMP考试的过与只是
我在一年多时间里參加了三次PMP考试,前两次都失败,直到第三次才成功.怎样对待失败?这是每个人都会遇到的挑战.假设我们能用正确的态度对待临时的失败,那么终于的成功也就不远了.我希望通过本文与大家分享一 ...
- 从robots.txt開始网页爬虫之旅
做个网页爬虫或搜索引擎(下面统称蜘蛛程序)的各位一定不会陌生,在爬虫或搜索引擎訪问站点的时候查看的第一个文件就是robots.txt了.robots.txt文件告诉蜘蛛程序在server上什么文件是能 ...
- oracle7
管理初始化参数 管理初始化参数(调优的一个重要知识点,凭什么可以对数据库进行调优呢?是因为它可以对数据库的一些参数进行修改修正) 初始化参数用于设置实例或是数据库的特征.oracle9i提供了200多 ...
- mysql 交互式连接和非交互式连接
交互式客户端定义为在mysql_real_connect()中使用CLIENT_INTERACTIVE选项的客户端 mysql_real_connect() 函数介绍 函数原型描述: MYSQL *m ...