/**
* 任何人任何机构皆可用于任何项目,此软件免费无需书面授权
* 在软件和软件的所有副本中都必须包含版权声明和软件相关注解
*
* 模块: urlcode.c
* 简述: URL编码与解码
* 作者: woods zhang -> hoojar@163.com ->
* 版权: 2006-2018, 张树林 拥有此源码所有版权 (MIT许可协议)
* Copyright 2006-2018, Woods Zhang All Rights Reserved (The MIT License)
*/
#include <;
#include <;
#include <c;
#include <;
/**
* 十六进制转换为十进制
*
* @param code 要转换的十六进制字符
* @return 转码后的十进制
*/
char hexdec(char ch)
{
return (char)(isdigit(ch) ? ch - '0' : toupper(ch) - 'A' + 10);
}
/**
* 十进制转换为十六进制
*
* @param code 要转换的十进制字符
* @return 转码后的十六进制
*/
char dechex(char code)
{
static char hex[] = "0123456789ABCDEF";
return hex[code & 15];
}
/**
* 编码 URL 字符串(调用完后需要free)
*
* @param str 要编码的字符串
* @return 编码后的字符串
*/
char *urlencode(const char *str)
{
char *buf = malloc(strlen(str) * 3 + 1), *ret = buf;
while (*str)
{
if (isalnum(*str) || *str == '-' || *str == '_' || *str == '.' || *str == '~')
{
*buf++ = *str;
}
else if (*str == ' ')
{
*buf++ = '+';
}
else
{
*buf++ = '%', *buf++ = dechex(*str >> 4), *buf++ = dechex(*str & 15);
}
str++;
}
*buf = '';
return ret;
}
/**
* 解码 URL 字符串(调用完后需要free)
*
* @param str 要编码的字符串
* @return 解码后的字符串
*/
char *urldecode(const char *str)
{
char *buf = malloc(strlen(str) + 1), *ret = buf;
while (*str)
{
if (*str == '%')
{
if (str[1] && str[2])
{
*buf++ = hexdec(str[1]) << 4 | hexdec(str[2]);
str += 2;
}
}
else if (*str == '+')
{
*buf++ = ' ';
}
else
{
*buf++ = *str;
}
str++;
}
*buf = '';
return ret;
}
int main(int argc, const char *argv[])
{
char url[] = "name=name&sex=man&url=?test=ok";
char *eurl = urlencode(url);
printf("url encode: %s", eurl);
char *durl = urldecode(eurl);
printf("url decode: %s", durl);
free(eurl);
free(durl);
return 0;
}