您的位置:首页 > 其它

URL链接中汉字乱码转UTF-8和gb2312

2016-04-02 18:45 344 查看
在使用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大。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  url 数据