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