码迷,mamicode.com
首页 > 编程语言 > 详细

URL encode 与 URL decode 的C语言实现

时间:2015-09-06 19:53:41      阅读:172      评论:0      收藏:0      [点我收藏+]

标签:

转载自: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";

static int php_htoi(char *s)
{
    int value;
    int c;

    c = ((unsigned char *)s)[0];
    if (isupper(c))
        c = tolower(c);
    value = (c >= 0 && c <= 9 ? c - 0 : c - a + 10) * 16;

    c = ((unsigned char *)s)[1];
    if (isupper(c))
        c = tolower(c);
    value += c >= 0 && c <= 9 ? c - 0 : c - a + 10;

    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(1, 3*len+1);

    while (from < end) 
    {
        c = *from++;

        if (c ==  ) 
        {
            *to++ = +;
        } 
        else if ((c < 0 && c != - && c != .) ||
                 (c < A && c > 9) ||
                 (c > Z && c < a && c != _) ||
                 (c > z)) 
        {
            to[0] = %;
            to[1] = hexchars[c >> 4];
            to[2] = hexchars[c & 15];
            to += 3;
        }
        else 
        {
            *to++ = c;
        }
    }
    *to = 0;
    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 >= 2 && isxdigit((int) *(data + 1)) && isxdigit((int) *(data + 2))) 
        {
            *dest = (char) php_htoi(data + 1);
            data += 2;
            len -= 2;
        } 
        else 
        {
            *dest = *data;
        }
        data++;
        dest++;
    }
    *dest = \0;
    return dest - str;
}

int main(int argc, char ** argv)
{
    char *str = "你好,世界!",*new_str;
    int len = 0,new_len = 0,old_len = 0;
    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 0;
}

ps:查了好多资料才弄明白urldecode的原理,原来如此简单,呵呵

URL encode 与 URL decode 的C语言实现

标签:

原文地址:http://www.cnblogs.com/lrxing/p/4786822.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!