url链接中汉字乱码转utf-8和gb2312

在使用URL向服务器提交数据的时候,如果我们提交的数据中存在汉字,就会出现下列情况
http://192.168.11.22/cgi-bin/serial.cgi?type=text&text=%C9%DB%CD%FB%C8%A8

%C9%DB%CD%FB%C8%A8代表着什么,不是我们想要的数据,那它是什么呢?

去除所有%号:C9DBCDFBC8A8使用汉字内码查询可以看到
hanzi

将汉字内码转成一个汉字

  1. gb2312
    两个字节表示一个汉字

     #include <stdio.h>
     #include <string.h>
    
     int main(void)
     {
            char str[3];
    
            str[0]=201; /*201为C9的十进制值*/
            str[1]=219; /*219为DB的十进制值*/
            str[2]='\0';
            printf("C9DB的汉字的值为:%s",str);
            return 0;
     }
    

注:在终端先可以正确输出‘邵’,(使用gb2312编码,在linux下输出乱码,Windows下正常输出)
2. utf-8
三个字节表示一个汉字

多个汉字输出

    /*将十六进制数转为十进制*/
    int hex_to_decade(char * s)
    {
        char *digits="0123456789ABCDEF";

        /*判断大小写,小写的话转为大写,达到统一*/
        if (islower (s[0]))
            s[0]=toupper(s[0]);
        if (islower (s[1]))
            s[1]=toupper(s[1]);

        return 16*(strchr(digits,s[0])-strchr(digits,'0'))+(strchr(digits,s[1])-strchr(digits,'0'));
    }
    void url_to_gb_or_utf(char *get_url, char *return_gb_or_utf)
    {
        int url_position;/*用来保存get_url的位置*/
        int return_position;/*用来保存解码后的字符串的位置*/
        int url_len;/*用来保存get_url的长度*/
        char tmp[2];/*保存%后面的十六进制字符*/
        url_len = strlen(get_url);
        return_position = 0;

        fprintf(stdout, "length=%d\n", url_len);
        for ( url_position = 0; url_position < url_len; )
        {
            /*如果是%将它后面的十六进制字符考到数组里*/
            if ( get_url[url_position] == '%' ){
                tmp[0] = get_url[url_position+1];/*第一个十六进制字符*/
                tmp[1] = get_url[url_position+2];/*第二个*/
            //  tmp[2] = '\0';  **串口通信中会出现乱码,结尾必须不能有其他字符**

                url_position+= 3; /*使url_position跳到的下一个%*/
                /*将十六进制数转为十进制后考入要返回的数组里*/

                return_gb_or_utf[return_position] = hex_to_decade(tmp);
                fprintf(stdout, "------%d\n", return_gb_or_utf[return_position] );
            }
            /*如果不是特殊字符,如英文,数字那么直接返回*/
            else{
                return_gb_or_utf[return_position] = get_url[url_position];
                url_position++;
            }
            return_position++;
        }

        return_gb_or_utf[return_position] = 0;
    }

***十六进制转十进制可使用:strtol函数*

汉字编码

  1. UTF-8:Unicode TransformationFormat-8bit,允许含BOM,但通常不含BOM。是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24为(三个字节)来编码。
  2. GBK是国家标准GB2312基础上扩容后兼容GB2312的标准。GBK的文字编码是用双字节来表示的,即不论中、英文字符均使用双字节来表示,为了区分中文,将其最高位都设定成1。GBK包含全部中文字符,是国家编码,通用性比UTF8差,不过UTF8占用的数据库比GBD大。