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