目录
一、URL编码介绍
URL编码是一种浏览器用来打包表单输入的格式。浏览器从表单中获取所有的name和其中的值 ,将它们以name/value参数编码(移去那些不能传送的字符,将数据排行等等)作为URL的一部分或者分离地发给服务器。
二、URL编码规则
URL编码遵循下列规则: 其基本格式为"key=value"这种键值对的,如果要传多个参数就需要用“&”符号对键值对进行分割。每对name/value由&符分开;每对来自表单的name/value由‘=’分开。如果用户没有输入值给这个name,那么这个name还是出现,只是无值。任何特殊的字符(包括ASCII中没有对应可显示字符的,如汉字;不安全字符,如【”%<>[]{}|\^`】之类)将以百分符%用十六进制编码,而像【0-9】【a-z】【A-Z】,保留字符【#~&/:;=?@.】等,则可以直接出现在URL上。其实url编码就是一个字符ascii码的十六进制。不过稍微有些变动,需要在前面加上“%”。比如“\”,它的ascii码是92,92的十六进制是5c,所以“\”的url编码就是%5c。
三、C语言代码实现
/*********************************************************************************
* Copyright: (C) 2019 zyjin
* All rights reserved.
*
* Filename: main.c
* Description: C语言实现URL编码
*
* Created by zyjin on 19-7-18.
*
* Version: 1.0.0(2019年7月18日)
* Author: zyjin <jzy2410723051@163.com><zzzzyjin@foxmail.com>
* ChangeLog: 1, Release initial version on "2019年7月18日 22时43分"
*
********************************************************************************/
#include "url.h"
int main()
{
char *a = malloc(480000);
strcat(a,"#~&/:;=?@asd2%<>[]{}|\\136g%$%^$%^uyf,");
urlencode(a);
printf("encode result is %s\n",a);
urldecode(a);
printf("decode result is %s\n",a);
free(a);
return 0;
}
/*********************************************************************************
* Copyright: (C) 2019 zyjin
* All rights reserved.
*
* Filename: url.c
* Description: C语言实现URL编码
*
* Created by zyjin on 19-7-18.
*
* Version: 1.0.0(2019年7月18日)
* Author: zyjin <jzy2410723051@163.com><zzzzyjin@foxmail.com>
* ChangeLog: 1, Release initial version on "2019年7月18日 22时43分"
*
********************************************************************************/
#include "url.h"
int hex2dec(char c)
{
if ('0' <= c && c <= '9')
{
return c - '0';
}
else if ('a' <= c && c <= 'f')
{
return c - 'a' + 10;
}
else if ('A' <= c && c <= 'F')
{
return c - 'A' + 10;
}
else
{
return -1;
}
}
char dec2hex(short int c)
{
if (0 <= c && c <= 9)
{
return c + '0';
}
else if (10 <= c && c <= 15)
{
return c + 'A' - 10;
}
else
{
return -1;
}
}
//编码一个url
void urlencode(char url[])
{
int i = 0;
int len = strlen(url);
int res_len = 0;
char res[BURSIZE];
for (i = 0; i < len; ++i)
{
char c = url[i];
if ( ('0' <= c && c <= '9') ||
('a' <= c && c <= 'z') ||
('A' <= c && c <= 'Z') ||
c == '/' || c == '.'|| c == '#' || c == '~' || c == '&'
|| c == ':' || c == ';' || c == '=' || c == '?' || c == '@' ||
c == '$' || c == '*'||c == '(' || c == ')'||c == ','
)
{
res[res_len++] = c;
}
else
{
int j = (short int)c;
if (j < 0)
j += 256;
int i1, i0;
i1 = j / 16;
i0 = j - i1 * 16;
res[res_len++] = '%';
res[res_len++] = dec2hex(i1);
res[res_len++] = dec2hex(i0);
}
}
res[res_len] = '\0';
strcpy(url, res);
}
// 解码url
void urldecode(char url[])
{
int i = 0;
int len = strlen(url);
int res_len = 0;
char res[BURSIZE];
for (i = 0; i < len; ++i)
{
char c = url[i];
if (c != '%')
{
res[res_len++] = c;
}
else
{
char c1 = url[++i];
char c0 = url[++i];
int num = 0;
num = hex2dec(c1) * 16 + hex2dec(c0);
res[res_len++] = num;
}
}
res[res_len] = '\0';
strcpy(url, res);
}
/*********************************************************************************
* Copyright: (C) 2019 zyjin
* All rights reserved.
*
* Filename: url.h
* Description: C语言实现URL编码
*
* Created by zyjin on 19-7-18.
*
* Version: 1.0.0(2019年7月18日)
* Author: zyjin <jzy2410723051@163.com><zzzzyjin@foxmail.com>
* ChangeLog: 1, Release initial version on "2019年7月18日 22时43分"
*
********************************************************************************/
#ifndef URL_190718_URL_H
#define URL_190718_URL_H
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define BURSIZE 480000
int hex2dec(char c);
char dec2hex(short int c);
void urlencode(char url[]);
void urldecode(char url[]);
#endif //URL_190718_URL_H