Chinaunix

标题: 紧急求助关于html decode [打印本页]

作者: gejiajie_01    时间: 2009-03-31 11:36
标题: 紧急求助关于html decode
想用C写一个html格式汉字解码的函数,不知道怎么写(例:&#24320是html编码格式,对应中文是 “开”字),有哪位大哥有的贴一下,只要C的,其他的就不要了,小弟真心感谢各位的帮助。
作者: gejiajie_01    时间: 2009-03-31 13:21
小弟在线等
作者: Sorehead    时间: 2009-03-31 16:58
字符串替换一下不就行了
作者: gejiajie_01    时间: 2010-02-21 11:45
哪位大哥请给出代码,谢谢
作者: MMMIX    时间: 2010-02-21 15:52
哪位大哥请给出代码,谢谢
gejiajie_01 发表于 2010-02-21 11:45



    作业?工作任务?
作者: gejiajie_01    时间: 2010-02-21 17:14
C++之类的都有库函数来实现,C找不到,有代码的请帮忙贴下,谢谢
作者: gejiajie_01    时间: 2010-02-21 17:19
写了一支垃圾程式,可以输出&#xx,&#xxx,但中文字符却怎么都输出不对,比如上述的“开”字,就输不出来,不晓得怎么回事,代码如下:
#include <stdio.h>
void urldecode(char *p)
{
        register i=0, len=0;
        char *q;
        while(*(p+i))
        {
                if ((*p=*(p+i)) == '&' && *(p+i+1) == '#' )
                {
                        q=p+i;
                        while(*q != ';') q++;
                        len=q-p-i-2;
                        //printf("%d\n", len);
                        switch(len)
                        {
                                case 2:*p=*(p+i+2) >= 'A' ? ((*(p+i+2) & 0XDF) - 'A') + 10 : (*(p+i+2) - '0');
                                       *p=(*p) * 10;
                                       *p+=*(p+i+3) >= 'A' ? ((*(p+i+3) & 0XDF) -  'A') + 10 : (*(p+i+3) - '0');
                                       i+=4;
                                       break;
                                case 3:*p=*(p+i+2) >= 'A' ? ((*(p+i+2) & 0XDF) - 'A') + 10 : (*(p+i+2) - '0');
                                       *p=(*p) * 10;
                                       *p+=*(p+i+3) >= 'A' ? ((*(p+i+3) & 0XDF) -  'A') + 10 : (*(p+i+3) - '0');
                                       *p=(*p) * 10;
                                       *p+=*(p+i+4) >= 'A' ? ((*(p+i+4) & 0XDF) -  'A') + 10 : (*(p+i+4) - '0');
                                       i+=5;
                                       break;
                                case 4:*p=*(p+i+2) >= 'A' ? ((*(p+i+2) & 0XDF) - 'A') + 10 : (*(p+i+2) - '0');
                                       *p=(*p) * 10;
                                       *p+=*(p+i+3) >= 'A' ? ((*(p+i+3) & 0XDF) -  'A') + 10 : (*(p+i+3) - '0');
                                       *p=(*p) * 10;
                                       *p+=*(p+i+4) >= 'A' ? ((*(p+i+4) & 0XDF) -  'A') + 10 : (*(p+i+4) - '0');
                                       *p=(*p) * 10;
                                       *p+=*(p+i+5) >= 'A' ? ((*(p+i+5) & 0XDF) -  'A') + 10 : (*(p+i+5) - '0');
                                       i+=6;
                                       break;
                                case 5:*p=*(p+i+2) >= 'A' ? ((*(p+i+2) & 0XDF) - 'A') + 10 : (*(p+i+2) - '0');
                                       *p=(*p) * 10;
                                       *p+=*(p+i+3) >= 'A' ? ((*(p+i+3) & 0XDF) -  'A') + 10 : (*(p+i+3) - '0');
                                       *p=(*p) * 10;
                                       *p+=*(p+i+4) >= 'A' ? ((*(p+i+4) & 0XDF) -  'A') + 10 : (*(p+i+4) - '0');
                                       *p=(*p) * 10;
                                       *p+=*(p+i+5) >= 'A' ? ((*(p+i+5) & 0XDF) -  'A') + 10 : (*(p+i+5) - '0');
                                       *p=(*p) * 10;
                                       *p+=*(p+i+6) >= 'A' ? ((*(p+i+6) & 0XDF) -  'A') + 10 : (*(p+i+6) - '0');
                                       i+=7;
                                       break;
                        }
                }
                p++;
        }
        *p='\0';
}

int main(){
        char a[]="dd{&#64;32r4&#64;aaa.com";
        urldecode(a);
        printf("%s", a);
        return 0;
}
作者: gejiajie_01    时间: 2010-02-21 17:20
输出结果是:dd{@32r4@aaa.com
作者: gejiajie_01    时间: 2010-02-21 17:22
代码中  a[]=dd{...中的 “{”字符请换成&#的格式,xxx为123,其他照贴,请各位大侠帮忙debug看看,谢谢
作者: gejiajie_01    时间: 2010-02-23 10:07
这个问题真的很难吗?有哪位大侠帮忙看看呢,感激不尽
作者: gejiajie_01    时间: 2010-02-24 10:53
char* htmldecode(char *p, int *str_len, char *buf)
{
        register i=0, len=0;
        char *q;
        char tmp[8192];
        unsigned int c;
        bzero(buf, sizeof(buf));
        bzero(tmp, sizeof(tmp));
        strncpy(tmp, p, *str_len);
        (*str_len)=0;
        p=tmp;
        while(*(p+i))
        {
                if ((*p=*(p+i)) == '&' && *(p+i+1) == '#' )
                {
                        q=p+i;
                        while(*q != ';') q++;
                        len=q-p-i;
                        c=(atoi(p+i+2));
                        memcpy(buf, &c, 2);
                        buf+=2;
                        p++;
                        (*str_len)+=2;
                        i=q-p;
                }else{
                        c=(*p);
                        memcpy(buf, &c, 2);
                        buf+=2;
                        (*str_len)+=2;
                }
                p++;
        }
        *p='\0';
}

int main(){
        char a[]="aa我&#64;.doc&#64;sadf&#64;";
        int len;
        int i;
        unsigned char *str = (unsigned char *) malloc (strlen(a)*2);
        len=strlen(a);
        htmldecode(a, &len, str);
        printf("%s\n", a);
        for(i=0; i<len; i++)
        printf("%c", str[i]);
        free(str);
        return 0;
}
作者: gejiajie_01    时间: 2010-02-24 10:54
终于弄出来了,只不过字符是utf-16的,要转成UTF-8比较好,我就不转了,自己给自己结贴 !
作者: gejiajie_01    时间: 2010-02-24 10:56
对,UTF-16转UTF-8我也发过帖子,想看的可以search下
作者: wesleyluo    时间: 2010-03-11 17:05
输出中文字符肯定要字符集啦?
你装没?




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2